[ 
https://issues.apache.org/jira/browse/OPENJPA-568?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Sandeep Shrivastava updated OPENJPA-568:
----------------------------------------

    Attachment: openjpa-1.1.0-SNAPSHOT-r420667.634150.patch

The fix to the VersionAttachStrategy class that addresses this issue.

> Delete, re-insert and setting relationship in the same transaction results in 
> ------------------------------------------------------------------------------
>
>                 Key: OPENJPA-568
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-568
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: kernel
>    Affects Versions: 1.1.0
>         Environment: This problem is reported with OpenJPA version: 
> $ java org.apache.openjpa.conf.OpenJPAVersion 
> OpenJPA 1.1.0-SNAPSHOT 
> version id: openjpa-1.1.0-SNAPSHOT-r420667:634150 
> Apache svn revision: 420667:634150 
> os.name: Windows XP 
> os.version: 5.1 
> os.arch: x86 
> java.version: 1.6.0_05 
> java.vendor: BEA Systems, Inc. 
>            Reporter: Sandeep Shrivastava
>             Fix For: 1.1.0
>
>         Attachments: openjpa-1.1.0-SNAPSHOT-r420667.634150.patch
>
>   Original Estimate: 24h
>  Remaining Estimate: 24h
>
> The test deletes and instance and creates another with the same primary keys 
> and encounters an exception while making the new one persistent.
> Here is the snippet from the test code:
>         pm.currentTransaction().begin();
>         MappingTest2 test2c = new MappingTest2();
>         test2c.setPk1(test2b.getPk1());
>         test2c.setPk2(test2b.getPk2());
>         pm.deletePersistent(test2b);
>         test4.getNManyMap().put("key2", test2);
>         test4.getManyManyMap().remove(test2b);
>         test4.getManyManyMap().put(test2, test2);
>         pm.makePersistent(test2c);
>         test4.setInverseOneOne(test2c);
>         MappingTest4 test4c = new MappingTest4();
>         test4c.setInverseOwnerOneOne(test2c);
>         test2c.setOneOneOwner(test4c);
>         pm.makePersistent(test4c);
>         pm.currentTransaction().commit();
> The problem with this issue was that the JDO PersistenceManager. 
> makePersistent() is failing with the following exception:
> [testlogic] <openjpa-1.1.0-SNAPSHOT-r420667:634150 nonfatal user error>
> kodo.jdo.UserException: Operation attempted on a deleted instance.
> [testlogic] FailedObject: kodo.jdbc.meta.MappingTest2-3::4
> [testlogic]   at org.apache.openjpa.kernel.PCState.error(PCState.java:443)
> [testlogic]   at 
> org.apache.openjpa.kernel.PDeletedState.beforeOptimisticWrite(PDeletedState.java:76)
> [testlogic]   at 
> org.apache.openjpa.kernel.StateManagerImpl.dirty(StateManagerImpl.java:1571)
> [testlogic]   at 
> org.apache.openjpa.kernel.StateManagerImpl.settingObjectField(StateManagerImpl.java:1898)
> [testlogic]   at 
> org.apache.openjpa.kernel.AttachStrategy.attachField(AttachStrategy.java:204)
> [testlogic]   at 
> org.apache.openjpa.kernel.VersionAttachStrategy.attach(VersionAttachStrategy.java:164)
> [testlogic]   at 
> org.apache.openjpa.kernel.AttachManager.attach(AttachManager.java:241)
> [testlogic]   at 
> org.apache.openjpa.kernel.VersionAttachStrategy.attachInPlace(VersionAttachStrategy.java:267)
> [testlogic]   at 
> org.apache.openjpa.kernel.VersionAttachStrategy.attachFieldsInPlace(VersionAttachStrategy.java:218)
> [testlogic]   at 
> org.apache.openjpa.kernel.VersionAttachStrategy.attach(VersionAttachStrategy.java:133)
> [testlogic]   at 
> org.apache.openjpa.kernel.AttachManager.attach(AttachManager.java:241)
> [testlogic]   at 
> org.apache.openjpa.kernel.AttachManager.attach(AttachManager.java:101)
> [testlogic]   at 
> org.apache.openjpa.kernel.BrokerImpl.attach(BrokerImpl.java:3191)
> [testlogic]   at kodo.kernel.KodoBroker.attach(KodoBroker.java:251)
> [testlogic]   at 
> org.apache.openjpa.kernel.DelegatingBroker.attach(DelegatingBroker.java:1142)
> [testlogic]   at 
> kodo.jdo.PersistenceManagerImpl.makePersistent(PersistenceManagerImpl.java:496)
> [testlogic]   at 
> kodo.jdbc.kernel.TestFlush.testDeleteAndReInsert(TestFlush.java:124)
> Synopsis:
> When the second call to pm.makePersistent(test2c) is made it is not attached 
> correctly. The effect of the prior pm.deletePersistent(test2b) which deletes 
> the object with the same key is kept in the persistence context and hence 
> when a relation is established with the deleted entity the third 
> pm.makePersistent(test4c) call throws the above exception.
> The fix that I have is to correct the logic in the 
> org.apache.openjpa.kernel.VersionAttachStrategy.attach() method where it 
> tries to make a determination of whether this is a new object by also 
> checking whether the existing entity is deleted or not. And that fixes the 
> problem. I will attach it as a patch shortly.
> Thanks
> Sandeep

-- 
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