[
https://issues.apache.org/jira/browse/OPENJPA-722?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12632330#action_12632330
]
Jeremy Bauer commented on OPENJPA-722:
--------------------------------------
Regarding the delete test. Should we expect the merge operation to delete an
entity that was marked as delete and then detached when the persistence context
was cleared?
According to the spec (3.2.4.1 Merging Detached Entity State):
• If X is a removed entity instance, an IllegalArgumentException will be thrown
by the
merge operation (or the transaction commit will fail).
Does this still hold true after the em has been cleared without a commit? If
not, wouldn't you expect the test query:
assertEquals(0, query("select x from Item x "
+ "where x.itemName = 'cup'").
getResultList().size());
to return one item instead of zero? It seems like we should either merge the
entity or throw an exception. My current opinion is that we should throw an
exception. What do you think?
Other opinions?
> persist - clear - merge scenario doesn't work
> ---------------------------------------------
>
> Key: OPENJPA-722
> URL: https://issues.apache.org/jira/browse/OPENJPA-722
> 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: TestEntityManagerClear-V2.java,
> TestEntityManagerClear.java
>
>
> 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.