[ 
https://issues.apache.org/jira/browse/AIRAVATA-2872?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Marcus Christie updated AIRAVATA-2872:
--------------------------------------
    Description: 
In OpenJPA, the default handling of null values on detached instances is to 
treat them as "unloaded" when merging them, meaning it treats them as if they 
are simply missing instead of treating them as having been set to null. That 
is, it skips over null value and doesn't update the corresponding fields on the 
persistent instances to have a null value.

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.


  was:
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.



> 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
>            Priority: Major
>
> In OpenJPA, the default handling of null values on detached instances is to 
> treat them as "unloaded" when merging them, meaning it treats them as if they 
> are simply missing instead of treating them as having been set to null. That 
> is, it skips over null value and doesn't update the corresponding fields on 
> the persistent instances to have a null value.
> 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)

Reply via email to