openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Jody Grassel (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (OPENJPA-2405) EntityManager.merge does not work for entity that is managed by another EntityManager
Date Fri, 28 Jun 2013 18:30:21 GMT

    [ 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

Mime
View raw message