Author: hthomann
Date: Thu Apr 25 01:43:56 2013
New Revision: 1471807

URL: http://svn.apache.org/r1471807
Log:
OPENJPA-2325: MappedSuperClass without an @Id causes wrong identity type for 
the inherited types - back-ported to 2.2.x Pinaki Poddar's commit to trunk.

Added:
    
openjpa/branches/2.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/mappedsuperclass/DerivedEntityFromMappedSuperWithoutId.java
      - copied unchanged from r1470097, 
openjpa/branches/2.2.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/mappedsuperclass/DerivedEntityFromMappedSuperWithoutId.java
    
openjpa/branches/2.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/mappedsuperclass/MappedSuperWithoutId.java
      - copied unchanged from r1470097, 
openjpa/branches/2.2.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/mappedsuperclass/MappedSuperWithoutId.java
Modified:
    openjpa/branches/2.2.x/   (props changed)
    
openjpa/branches/2.2.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/ClassMetaData.java
    
openjpa/branches/2.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/mappedsuperclass/TestMappedSuperClass.java

Propchange: openjpa/branches/2.2.x/
------------------------------------------------------------------------------
  Merged /openjpa/branches/2.2.1.x:r1470097
  Merged /openjpa/branches/2.1.x:r1469949
  Merged /openjpa/trunk:r1436957,1436960

Modified: 
openjpa/branches/2.2.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/ClassMetaData.java
URL: 
http://svn.apache.org/viewvc/openjpa/branches/2.2.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/ClassMetaData.java?rev=1471807&r1=1471806&r2=1471807&view=diff
==============================================================================
--- 
openjpa/branches/2.2.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/ClassMetaData.java
 (original)
+++ 
openjpa/branches/2.2.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/ClassMetaData.java
 Thu Apr 25 01:43:56 2013
@@ -179,7 +179,7 @@ public class ClassMetaData
     private List<Class<?>> _interfaces = null;
     private final Map<Class<?>,Map<String,String>> _ifaceMap = 
        new HashMap<Class<?>,Map<String,String>>();
-    private int _identity = ID_UNKNOWN;
+    private Integer _identity = null;
     private int _idStrategy = ValueStrategies.NONE;
     private int _accessType = AccessCode.UNKNOWN;
     
@@ -440,21 +440,25 @@ public class ClassMetaData
      * primary key fields, and {@link #ID_APPLICATION} otherwise.
      */
     public int getIdentityType() {
-        if (_identity == ID_UNKNOWN) {
-            ClassMetaData sup = getPCSuperclassMetaData();
-            if (sup != null && sup.getIdentityType() != ID_UNKNOWN)
-                _identity = sup.getIdentityType();
-            else if (getPrimaryKeyFields().length > 0)
-                _identity = ID_APPLICATION;
-            else if (isMapped())
-                _identity = ID_DATASTORE;
-            else
-                _identity = _repos.getMetaDataFactory().getDefaults().
-                    getDefaultIdentityType();
-        }
+       if (_identity != null) {
+               return _identity;
+       } else {
+               ClassMetaData sup = getPCSuperclassMetaData();
+               if (sup != null && sup.getIdentityType() != ID_UNKNOWN) 
+                   _identity = sup.getIdentityType();
+               else if (getPrimaryKeyFields().length > 0) 
+                   _identity = ID_APPLICATION;
+               else if (isMapped()) 
+                   _identity = ID_DATASTORE;
+               else if (isAbstract())
+                       _identity = ID_UNKNOWN;
+               else
+                   _identity = _repos.getMetaDataFactory().getDefaults().
+                        getDefaultIdentityType();
+       }
         return _identity;
     }
-
+  
     /**
      * The type of identity being used. This will be one of:
      * <ul>
@@ -2511,8 +2515,9 @@ public class ClassMetaData
         _embeddable = meta._embeddable;
         _interface = (meta.isManagedInterface()) ? Boolean.TRUE : 
Boolean.FALSE;
         setIntercepting(meta.isIntercepting());
+        _abstract = meta.isAbstract();
         _impl = meta.getInterfaceImpl();
-        _identity = meta.getIdentityType();
+        _identity = meta._identity == null ? null : meta.getIdentityType();
         _idStrategy = meta.getIdentityStrategy();
         _seqName = meta.getIdentitySequenceName();
         _seqMeta = null;

Modified: 
openjpa/branches/2.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/mappedsuperclass/TestMappedSuperClass.java
URL: 
http://svn.apache.org/viewvc/openjpa/branches/2.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/mappedsuperclass/TestMappedSuperClass.java?rev=1471807&r1=1471806&r2=1471807&view=diff
==============================================================================
--- 
openjpa/branches/2.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/mappedsuperclass/TestMappedSuperClass.java
 (original)
+++ 
openjpa/branches/2.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/mappedsuperclass/TestMappedSuperClass.java
 Thu Apr 25 01:43:56 2013
@@ -28,16 +28,22 @@ import org.apache.openjpa.persistence.te
 /**
  * Test case and domain classes were originally part of the reported issue
  * <A href="https://issues.apache.org/jira/browse/OPENJPA-873";>OPENJPA-873</A>
- *  
+ * <p>
+ * Added a new test where mapped super class does not decalre an identity.
+ * Originally reported 
+ * <A 
href="https://issues.apache.org/jira/browse/OPENJPA-2325";>OPENJPA-2325</A>
+ * 
  * @author [email protected]
  * @author Fay Wang
- *
+ * @author Pinaki Poddar
  */
 public class TestMappedSuperClass extends SingleEMFTestCase {
 
     public void setUp() {
         setUp(CashBaseEntity.class, 
-              SituationDA.class, ValuableItemDA.class, CLEAR_TABLES);
+              SituationDA.class, ValuableItemDA.class, 
+              MappedSuperWithoutId.class, 
DerivedEntityFromMappedSuperWithoutId.class,
+              CLEAR_TABLES);
     }
 
     public void testMappedSuperClass() {
@@ -73,4 +79,35 @@ public class TestMappedSuperClass extend
             em.close();
         }
     }
+    
+    /**
+     * Tests that new entity can be merged when the entity is derived from a 
mapped
+     * super class that does not declare an identity field.
+     */
+    public void 
testMergeNewInstanceDerivedFromMappedSuperClassWithoutIdentityField() {
+        EntityManager em = emf.createEntityManager();
+        em.getTransaction().begin();
+        final long id = System.currentTimeMillis();
+               DerivedEntityFromMappedSuperWithoutId pc = new 
DerivedEntityFromMappedSuperWithoutId();
+               pc.setId(id);
+               pc.setName("abc");
+               em.persist(pc);
+               em.getTransaction().commit();
+               em.close();
+       
+               DerivedEntityFromMappedSuperWithoutId newpc = new 
DerivedEntityFromMappedSuperWithoutId();
+               em = emf.createEntityManager();
+        em.getTransaction().begin();
+               newpc.setId(id);
+               newpc.setName("xyz");
+               em.merge(newpc);
+               em.getTransaction().commit();
+               em.close();
+               
+               em = emf.createEntityManager();
+               DerivedEntityFromMappedSuperWithoutId found = 
em.find(DerivedEntityFromMappedSuperWithoutId.class, id);
+               assertNotNull(found);
+               assertEquals("xyz", found.getName());
+               
+    }
 }


Reply via email to