[ 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)