Hi, When an entity is merged into the persistence context OpenJPA makes some assumptions about whether a field was intentionally set to null or whether it was never loaded from the database to begin with.
By default we assume that a null value indicates that the field was never loaded. This behavior can be changed by setting the openjpa.DetachState property. It's covered in the OpenJPA manual [1], but I'll try to give you a quick version. The possible values are : loaded (the default), fetch-groups, or all. Loaded indicates that only the loaded fields of the entity will be available after it's detached. As a result when the object is merged (or attached) any fields that are null are ignored. The fields may never have been loaded in the first place. Fetch-groups indicates that fields included in the current fetch configuration should be loaded before detaching the entity. When the entity is merged (or attached) OpenJPA checks the current fetch group - anything that would be included in that group that is set to null will be set on the database. All indicates that all fields will be loaded before detaching the entity. When the entity is merged (attached) all the fields are assumed to have been loaded - if one has been set to null it will be updated in the database. So one approach is to change the assumptions OpenJPA makes about which fields have been loaded. Adding <property name="openjpa.DetachState" value="fetch-groups"/> or <property name="openjpa.DetachState" value="all"/> may resolve your problem. Another approach is to use a detached state manager. The state manager is the object that OpenJPA uses to track the changes made to an entity class. By default the state manager is not serialized and saved with the entity when it is detached. This behavior can also be configured via the openjpa.DetachedState property: <property name="openjpa.DetachState" value="loaded(DetachedStateField=true)"/> I believe this will also resolve your issue if the entity is never serialized, at the cost of increasing the size of your detached entity. If the entity is serialized you would want this : <property name="openjpa.DetachState" value="loaded(DetachedStateField=transient)"/> instead. Sorry for the length of the response, I hope it helps to clear up your options. -mike [1] http://openjpa.apache.org/builds/latest/docs/manual/ref_guide_remote.html#ref_guide_detach_graph On Thu, Nov 13, 2008 at 8:04 AM, Norbert Rieger <[EMAIL PROTECTED]> wrote: > Hi, > > I use the merge because the object is modified while detached (client <=> > server/ejb). > > -----Ursprüngliche Nachricht----- > Von: Norbert Rieger [mailto:[EMAIL PROTECTED] > Gesendet: Donnerstag, 13. November 2008 14:38 > An: [email protected] > Betreff: Setting NULL value on OneToOne mapping > > Hi, > > how do I "reset" (set foreign key field to NULL) a assocation in a OneToOne > relationship ? > > I tried to set it to "null" and then execute merge, but the UPDATE command > does not include this. > > e.g. > > // ---------------------------- > @Entity > class M > { > @Id > long id ; > .... > } > > // ---------------------------- > @Entity > class P > { > @Id > long id ; > int x; > int y; > @OneToOne // optional should be true by default > M myM ; > > public void setMyM (M theM) > { myM = theM ; } > > } > > .... > P p = em.find (....) > p.setX (); > p.setY (); > // release association > p.setMyM ((M)null) ; > em.merge(p) ; > > X,Y are updated, but field P.M_ID (foreign key field P=>M) stays unchanged. > > How to do this, merge oder by an update command ? > > Thanks a lot in advance > > NR > >
