[ 
https://issues.apache.org/jira/browse/OPENJPA-2262?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13457391#comment-13457391
 ] 

Rick Curtis commented on OPENJPA-2262:
--------------------------------------

Hmm, ok. Could I have you post a simple unit test that recreates the issue?
                
> 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
>         Attachments: BaseEntity.java, Blob.java
>
>
> 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 others (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); // EntityNotFoundException
>         } 
> 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

Reply via email to