You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openjpa.apache.org by "Roger Keays (JIRA)" <ji...@apache.org> on 2012/09/17 22:29:07 UTC
[jira] [Updated] (OPENJPA-2262) Merging Deserialized Objects
Reports Duplicate IDs
[ https://issues.apache.org/jira/browse/OPENJPA-2262?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Roger Keays updated OPENJPA-2262:
---------------------------------
Affects Version/s: (was: 2.0.0)
2.2.0
> Merging Deserialized Objects Reports Duplicate IDs
> --------------------------------------------------
>
> Key: OPENJPA-2262
> URL: https://issues.apache.org/jira/browse/OPENJPA-2262
> Project: OpenJPA
> Issue Type: Bug
> Components: kernel
> Affects Versions: 2.2.0
> Environment: Java 1.6, Postgres
> Reporter: Roger Keays
>
> OPENJPA-792 patched a defect where putting @Id in the superclass caused primary key conflicts in the subclasses.
>
> https://issues.apache.org/jira/browse/OPENJPA-792
> I get the same error described in OPENJPA-792 when merging a deserialized instance of an object from my domain model. I can reproduce the problem with some objects in my domain model but not other (although the all have the same superclass which contains the @Id field).
> This only occurs after deserialization and closing and opening the EntityManager.
> My failing unit test looks like this.
> public void canMergeEntitiesWithMatchingIDAfterSerialization() throws
> IOException, ClassNotFoundException {
>
> // setup id sequences
> Long id = System.currentTimeMillis();
> EntityManager em = DB.getPersistenceContext();
> em.getTransaction().begin();
> em.createNativeQuery(
> "SELECT setval('cms_content_id_seq', " + id + ");")
> .getResultList();
> em.createNativeQuery(
> "SELECT setval('web_blobs_id_seq', " + id + ");")
> .getResultList();
>
> // persist with same id
> Server server = newServer();
> Content c = ContentTest.createValid(server);
> Blob b = BlobTest.createValid(server);
> em.persist(c);
> em.persist(b);
> em.getTransaction().commit();
> assertNotNull(c.getId());
> assertNotNull(b.getId());
> assertEquals(c.getId(), b.getId());
>
> // serialize and deserialize the object
> File file = File.createTempFile("blob", "bin");
> ObjectOutput out = new ObjectOutputStream(new FileOutputStream(file));
> out.writeObject(b);
> out.close();
> ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
> b = (Blob) in.readObject();
> in.close();
>
> // reopen db session and try to merge an update
> em.close();
> em = DB.getPersistenceContext();
> em.merge(b); // EntityExistsException
> }
> And the stacktrace is
> <openjpa-2.2.0-r422266:1244990 nonfatal store error> org.apache.openjpa.persistence.EntityNotFoundException: Attempted to attach instance "1347912956793" of type "class ox.webcore.blobs.Blob", but this instance is already in the datastore as type "class ox.cms.content.Content".
> FailedObject: ox.webcore.blobs.Blob@162e703
> at org.apache.openjpa.kernel.VersionAttachStrategy.attach(VersionAttachStrategy.java:118)
> at org.apache.openjpa.kernel.AttachManager.attach(AttachManager.java:252)
> at org.apache.openjpa.kernel.AttachManager.attach(AttachManager.java:105)
> at org.apache.openjpa.kernel.BrokerImpl.attach(BrokerImpl.java:3474)
> at org.apache.openjpa.kernel.DelegatingBroker.attach(DelegatingBroker.java:1214)
> at org.apache.openjpa.persistence.EntityManagerImpl.merge(EntityManagerImpl.java:878)
> at ox.webcore.util.DB$DBTest.canMergeEntitiesWithMatchingIDAfterSerialization(DB.java:145)
--
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