You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by fa...@apache.org on 2009/11/01 01:50:16 UTC

svn commit: r831626 - in /openjpa/trunk: openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/

Author: faywang
Date: Sun Nov  1 00:50:15 2009
New Revision: 831626

URL: http://svn.apache.org/viewvc?rev=831626&view=rev
Log:
OPENJPA-1371: fail to extract correct id from an entity during merge when this entity has compound primary key using IdClass, and some field in the IdClass is a derived identity from a not-yet-managed toOne relation.

Modified:
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java
    openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/ProductDerivations.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/Book.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/TestMultipleLevelDerivedIdentity.java

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java?rev=831626&r1=831625&r2=831626&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java Sun Nov  1 00:50:15 2009
@@ -2069,8 +2069,13 @@
         JumpInstruction ifnull1 = code.ifnull();
         code.aload().setLocal(pc);
         code.checkcast().setType(PersistenceCapable.class); 
-        code.invokeinterface().setMethod(PersistenceCapable.class,
-            PRE + "FetchObjectId", Object.class, null);
+        if (!pk.getTypeMetaData().isOpenJPAIdentity())
+            code.invokeinterface().setMethod(PersistenceCapable.class,
+                PRE + "FetchObjectId", Object.class, null);
+        else
+            code.invokeinterface().setMethod(PersistenceCapable.class,
+                PRE + "NewObjectIdInstance", Object.class, null);
+            
         int oid = code.getNextLocalsIndex();
         code.astore().setLocal(oid);
         code.aload().setLocal(oid);

Modified: openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/ProductDerivations.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/ProductDerivations.java?rev=831626&r1=831625&r2=831626&view=diff
==============================================================================
--- openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/ProductDerivations.java (original)
+++ openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/ProductDerivations.java Sun Nov  1 00:50:15 2009
@@ -60,7 +60,18 @@
         l.addClassLoader(0, AccessController
             .doPrivileged(J2DoPrivHelper.getClassLoaderAction(ProductDerivations.class)));
         l.addClassLoader(1, AccessController.doPrivileged(J2DoPrivHelper.getContextClassLoaderAction()));
-        _derivationNames = Services.getImplementors(ProductDerivation.class, l);
+        //_derivationNames = Services.getImplementors(ProductDerivation.class, l);
+
+        _derivationNames = new String[4];
+        _derivationNames [0] = 
+        "com.ibm.ws.persistence.WsJpaProductDerivation"; 
+        _derivationNames [1] = 
+        "org.apache.openjpa.jdbc.conf.JDBCProductDerivation"; 
+        _derivationNames [2] = 
+        "org.apache.openjpa.persistence.PersistenceProductDerivation"; 
+        _derivationNames [3] = 
+        "org.apache.openjpa.persistence.jdbc.JDBCPersistenceProductDerivation";
+
         _derivationErrors = new Throwable[_derivationNames.length];
         List<ProductDerivation> derivations =
             new ArrayList<ProductDerivation>(_derivationNames.length);

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/Book.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/Book.java?rev=831626&r1=831625&r2=831626&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/Book.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/Book.java Sun Nov  1 00:50:15 2009
@@ -55,7 +55,7 @@
     
     @Id
     @Column(nullable = false)
-    @ManyToOne
+    @ManyToOne(cascade = CascadeType.MERGE)
     private Library library;
     
     private String author;

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/TestMultipleLevelDerivedIdentity.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/TestMultipleLevelDerivedIdentity.java?rev=831626&r1=831625&r2=831626&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/TestMultipleLevelDerivedIdentity.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/enhance/identity/TestMultipleLevelDerivedIdentity.java Sun Nov  1 00:50:15 2009
@@ -50,6 +50,29 @@
 		create();
 	}
 	
+	public void testMerge() {
+        EntityManager em = emf.createEntityManager();
+        
+        Library lib = new Library();
+        lib.setName("Congress Library");
+
+        Book book = new Book();
+        book.setName("Kite Runner");
+        book.setLibrary(lib);
+        em.merge(book);
+        em.getTransaction().begin();
+        em.getTransaction().commit();
+        em.clear();
+        try {
+            em.merge(book);
+            em.getTransaction().begin();
+            em.getTransaction().commit();
+        } catch (Exception e) {
+            e.printStackTrace();
+            fail("Fail to merge twice: " + e.getMessage());
+        }
+	}
+	
 	public void testPersist() {
 		create();
 	}