Inconsistent behavior during merge with cascade=none
----------------------------------------------------

                 Key: OPENJPA-255
                 URL: https://issues.apache.org/jira/browse/OPENJPA-255
             Project: OpenJPA
          Issue Type: Bug
          Components: kernel
    Affects Versions: 0.9.7, 1.0.0
            Reporter: Gokhan Ergul
            Priority: Minor


Suppose you have 2 entities, A and B, with a unidirectional one-to-one relation 
from A to B and cascade=none. Persist A, B1 and B2, where A.b == B1. Later 
change A.b to B2 and merge, the operation may or may not succeed, depending on 
the following conditions:

- If both A and B2 is detached, merge succeeds.
- If both A and B2 is attached, iow managed in the same entity manager, merge 
succeeds.
- If A is detached and B2 is managed as above, merge fails with 'encountered 
new object ...' exception.

(It doesn't matter if the objects are versioned or not.) 

The latter case is a rather typical usecase involving a detached context, where 
the server application unmarshalls a user-modified domain object, creates an 
entity manager and further modifies that object before invoking merge (such as 
setting A.b depending on values of other fields). There are two workarounds for 
the issue: merge twice (merge/set server managed fields/merge), or explicitly 
detach all such relation objects before calling merge, but obviously neither is 
desirable.

Looking at the code, it all boils down to AttachStrategy.getReference(...) 
method. This method is invoked whenever a relation with cascade=none is 
encountered during merge operation (and only for that case). Yet this method 
assumes that the object *must* be detached or it will throw the mentioned 
exception --I don't see the logic behind that assumption.

Attached a testcase demonstrating that behaviour, and a possible fix for it 
--based on the premise that the above assumption is not correct. If that's not 
the case, I'd appreciate if someone can point me in the right direction as to 
why cascade=none on any type of relation field requires a detached object. 


-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to