openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Jeremy Bauer (JIRA)" <>
Subject [jira] Commented: (OPENJPA-722) persist - clear - merge scenario doesn't work
Date Fri, 19 Sep 2008 14:54:44 GMT


Jeremy Bauer commented on OPENJPA-722:

I conversed with a couple of the committers and the consensus was that we should not be storing
persistence context-type state in the detached entities.  Instead, the detached entity should
only manage information about the state of its persistent fields.

So, when we re-merge entities we should not depend on the "NEW" state in a detached object.
 The entity could have been inserted into the database outside of the application, in which
case we'd fail trying to do an insert (which should not happen on a merge).  I think the ideal
solution is to re-query for the entity and then perform the insert or update based on whether
the entity was or was not found - similar to merging an actual new entity.

One additional item:  The test code has a query immediately following the clear:

        assertEquals(1, query("select x from Item x "
                + "where x.itemName = 'cup'").

This essentially loads the returned item in the L1 cache, changing the behavior of the internal
merge processing   (the corresponding merge finds the item in the L1).  While this is a good
scenario to test, we should also test the scenario where the item isn't cached before the

> persist - clear - merge scenario doesn't work
> ---------------------------------------------
>                 Key: OPENJPA-722
>                 URL:
>             Project: OpenJPA
>          Issue Type: Sub-task
>          Components: kernel
>    Affects Versions: 1.0.3, 1.1.0, 1.2.0
>            Reporter: Xiaoqin Feng
>            Assignee: Jeremy Bauer
>         Attachments: openjpa-722-fromQin.patch,,
> EntityManager.clear() now don't  flush new object but only detach it.
> But DetachManager still flush dirty object and assume detached objects are in clean state.
> When the "new" object is merged back and transaction commit,  because the object state
lost its original state PNEW, it will not be added to insert list  and not flushed to DB.
> According to the EntityManager.clear() API,  changes made to entities that have not been
flushed to the database will not be persisted.  When they merges back to persistent context,
they all should kept there original state.
> I added the following test to org.apache.openjpa.persistence.simple.TestEntityManagerClear.
>     public void testClearMerge() {
>         // Create EntityManager and Start a transaction (1)
>         begin();
>         // Insert a new object then clear persistent context
>         AllFieldTypes testObject1 = new AllFieldTypes();
>         testObject1.setStringField("my test object1");
>         persist(testObject1);
>         //Object1 is not flushed to DB but only detached by clear().
>         em.clear();
>         em.merge(testObject1);
>         //expect the PCState is same as before detached, 
>         //so it is PNew instead of PCLEAN and is add to insert list.
>         commit();
>         //Start a new transaction
>         begin();
>         // Attempt retrieve of Object1 from previous PC (should exist)
>         assertEquals(1, query("select x from AllFieldTypes x "
>             + "where x.stringField = 'my test object1'").
>                 getResultList().size());
>         // Rollback the transaction and close everything
>         rollback();
>     }

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

View raw message