openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Sandeep Shrivastava (JIRA)" <j...@apache.org>
Subject [jira] Updated: (OPENJPA-568) Delete, re-insert and setting relationship in the same transaction results in
Date Fri, 11 Apr 2008 16:46:04 GMT

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


Mime
View raw message