[ 
https://issues.apache.org/jira/browse/AIRAVATA-2872?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16676989#comment-16676989
 ] 

Marcus Christie commented on AIRAVATA-2872:
-------------------------------------------

I believe I've fixed all places in the JPA mappings that might cause OpenJPA to 
null out of a foreign key reference because the mapped entity is not in the 
data model. As a guard against this happening accidentally, I've also added the 
NOT NULL constraint to all foreign key columns in the schema.

> 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