airavata-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Marcus Christie (JIRA)" <j...@apache.org>
Subject [jira] [Created] (AIRAVATA-2872) registry-refactoring: OpenJPA doesn't persist setting a field to null
Date Fri, 17 Aug 2018 20:10:00 GMT
Marcus Christie created AIRAVATA-2872:
-----------------------------------------

             Summary: registry-refactoring: OpenJPA doesn't persist setting a field to null
                 Key: AIRAVATA-2872
                 URL: https://issues.apache.org/jira/browse/AIRAVATA-2872
             Project: Airavata
          Issue Type: Bug
          Components: Registry API
            Reporter: Marcus Christie
            Assignee: Marcus Christie


In OpenJPA, the default handling of null values on detached instances is to treat them as
"unloaded" meaning it treats them as if they are simply missing instead of treating them as
having been set to null.

See https://stackoverflow.com/a/2569417/1419499

See also official docs: http://openjpa.apache.org/builds/2.4.3/apache-openjpa/docs/ref_guide_remote.html#ref_guide_detach,
however it's hard to understand how to make use of this in our context.

See also this discussion http://openjpa.208410.n2.nabble.com/null-values-not-updating-td3224059.html

I traced the OpenJPA code to these lines in VersionAttachStrategy:
{code:java}
        int detach = (isNew) ? DETACH_ALL : broker.getDetachState();
        FetchConfiguration fetch = broker.getFetchConfiguration();
        try {
            FieldMetaData[] fmds = sm.getMetaData().getFields(); 
            for (int i = 0; i < fmds.length; i++) {
                switch (detach) {
                    case DETACH_ALL:
                        attachField(manager, toAttach, sm, fmds[i], true);
                        break;
                    case DETACH_FETCH_GROUPS:
                        if (fetch.requiresFetch(fmds[i]) 
                            != FetchConfiguration.FETCH_NONE)
                            attachField(manager, toAttach, sm, fmds[i], true);
                        break;
                    case DETACH_LOADED:
                        attachField(manager, toAttach, sm, fmds[i], false);
                        break;
                }
            }
        } finally {
{code}

The detach state is {{DETACH_LOADED}} which causes OpenJPA to treat nulls as unloaded and
thus it skips merging those values in.

I think with a configuration change we can get this to work, but it's not obvious what all
the flags mean, so this will take some research.

One other question I have, is how did this work before. It would be worth checking to see
how the old registry code had configured OpenJPA.




--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Mime
View raw message