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

Jody Grassel commented on OPENJPA-2405:
---------------------------------------

Just reviewing this JIRA and wanted to post my own thoughts.  First, some clips 
from the JPA Specification that I think are relevant:

3.2 Entity Instance’s Life Cycle
This section describes the EntityManager operations for managing an entity 
instance’s lifecycle. An entity instance can be characterized as being new, 
managed, detached, or removed.
• • • •
A new entity instance has no persistent identity, and is not yet associated 
with a persistence context.
A managed entity instance is an instance with a persistent identity that is 
currently associated with a persistence context.
A detached entity instance is an instance with a persistent identity that is 
not (or no longer) associated with a persistence context.
A removed entity instance is an instance with a persistent identity, associated 
with a persistence context, that will be removed from the database upon 
transaction commit.

-- What I take from this is that an Entity Class that has been freshly created 
by its constructor (ie, not created by em.find() or a JPA query) and has never, 
ever been touched by an em.persist() or em.merge() operation is a "new entity". 
 Such an object will not have any StateManager (DetachedStateManager or 
otherwise, it is simply null) associated with its internal state (internal 
state being the hidden variables added by enhancement.)

-- A "managed entity" is an Entity Class instance that has a link to a live 
StateManager in its internal state -- and there's caveats to that.  A 
StateManager is associated to one and only one Persistence Context (ie, 
EntityManager instance) - to those and only those Persistence Contexts is the 
entity a "managed entity".  A new entity becomes a managed entity when 
em.persist() or em.merge() is called on it.  (Managed entities are also 
provided by find/query operations (though it would return a detached entity if 
it's a CMTS entitymanager invocation outside of a transaction.))

-- To any other Persistence Context, because it is not "new" (because it has a 
StateManager object associated with it) and has a non DetachedStateManager that 
is associated with another Persistence Context, it should be interpreted as a 
"detached entity" (even if the StateManager associated with the Entity Object 
instance's internal state is not a DetachedStateManager.)  So calling 
em.merge(entityWithSomeOtherPCsStateManager) should be treated as a detached 
entity, and return a new Entity Object instance.  Which could create 
"interesting problems" if the original entity doesn't have a committed row on 
the database yet (because the two different PCs will have two different db 
connections, and a merge operation will trigger a fetch operation from the 
database/cache.)  Remember the JPA spec requires Read-Committed to be the 
minimum isolation level.
                
> EntityManager.merge does not work for entity that is managed by another 
> EntityManager
> -------------------------------------------------------------------------------------
>
>                 Key: OPENJPA-2405
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-2405
>             Project: OpenJPA
>          Issue Type: Bug
>    Affects Versions: 2.2.3
>            Reporter: Arne Limburg
>         Attachments: OPENJPA-2405.patch
>
>
> EntityManager.merge does not work for entity that is managed by another 
> EntityManager. Instead of updating that entity OpenJPA tries to persist the 
> entity a second time

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to