You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2008/01/06 00:16:09 UTC

svn commit: r609234 - in /cayenne/main/trunk/framework/cayenne-jpa-unpublished/src: main/java/org/apache/cayenne/jpa/bridge/DataMapConverter.java test/java/org/apache/cayenne/jpa/bridge/DataMapConverterTest.java

Author: aadamchik
Date: Sat Jan  5 15:16:04 2008
New Revision: 609234

URL: http://svn.apache.org/viewvc?rev=609234&view=rev
Log:
CAY-953 JPA: Single Table inheritance
(fixing entity load order issues)

Modified:
    cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/bridge/DataMapConverter.java
    cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/test/java/org/apache/cayenne/jpa/bridge/DataMapConverterTest.java

Modified: cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/bridge/DataMapConverter.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/bridge/DataMapConverter.java?rev=609234&r1=609233&r2=609234&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/bridge/DataMapConverter.java (original)
+++ cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/bridge/DataMapConverter.java Sat Jan  5 15:16:04 2008
@@ -195,12 +195,14 @@
             dbAttribute.setAttributePrecision(column.getPrecision());
         }
 
-        DbEntity entity = targetPath
-                .firstInstanceOf(DataMap.class)
-                .getDbEntity(tableName);
+        DataMap dataMap = targetPath.firstInstanceOf(DataMap.class);
+        DbEntity entity = dataMap.getDbEntity(tableName);
 
         if (entity == null) {
-            throw new JpaProviderException("No DbEntity defined for table  " + tableName);
+            // table may be defined in a superclass that is not processed yet... so create
+            // a barebone version, with all remaining properties to be set later
+            entity = new DbEntity(tableName);
+            dataMap.addDbEntity(entity);
         }
 
         entity.addAttribute(dbAttribute);
@@ -739,17 +741,22 @@
         public void onFinishNode(ProjectPath path) {
 
             JpaEntity entity = path.firstInstanceOf(JpaEntity.class);
+            DataMap dataMap = targetPath.firstInstanceOf(DataMap.class);
             ObjEntity cayenneEntity = targetPath.firstInstanceOf(ObjEntity.class);
-            DbEntity cayennePrimaryTable = cayenneEntity.getDbEntity();
+
+            // as superentity may not be loaded yet, must lookup DbEntity via JPA
+            // mapping...
+            DbEntity cayennePrimaryTable = dataMap.getDbEntity(entity
+                    .lookupTable()
+                    .getName());
 
             for (JpaSecondaryTable secondaryTable : entity.getSecondaryTables()) {
 
                 // create a relationship between master DbEntity and a secondary
                 // DbEntity...
 
-                DbEntity cayenneSecondaryTable = cayennePrimaryTable
-                        .getDataMap()
-                        .getDbEntity(secondaryTable.getName());
+                DbEntity cayenneSecondaryTable = dataMap.getDbEntity(secondaryTable
+                        .getName());
 
                 JpaDbRelationship dbRelationship = new JpaDbRelationship(
                         getSecondaryTableDbRelationshipName(secondaryTable.getName()));
@@ -1032,11 +1039,15 @@
                     jpaTable.getName());
             if (cayenneEntity == null) {
                 cayenneEntity = new DbEntity(jpaTable.getName());
-                cayenneEntity.setCatalog(jpaTable.getCatalog());
-                cayenneEntity.setSchema(jpaTable.getSchema());
                 parentCayenneEntity.getDataMap().addDbEntity(cayenneEntity);
             }
 
+            // override catalog and schema even if this is an existing entity. See for
+            // instance JpaColumnVisitor for an example on how an entity without all
+            // properties is created early.
+            cayenneEntity.setCatalog(jpaTable.getCatalog());
+            cayenneEntity.setSchema(jpaTable.getSchema());
+
             parentCayenneEntity.setDbEntity(cayenneEntity);
             return cayenneEntity;
         }
@@ -1054,11 +1065,11 @@
                     jpaTable.getName());
             if (secondaryEntity == null) {
                 secondaryEntity = new DbEntity(jpaTable.getName());
-                secondaryEntity.setCatalog(jpaTable.getCatalog());
-                secondaryEntity.setSchema(jpaTable.getSchema());
-
                 parentCayenneEntity.getDataMap().addDbEntity(secondaryEntity);
             }
+
+            secondaryEntity.setCatalog(jpaTable.getCatalog());
+            secondaryEntity.setSchema(jpaTable.getSchema());
 
             // defer primary./secondary relationship creation till after parent entity's
             // children are fully parsed...

Modified: cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/test/java/org/apache/cayenne/jpa/bridge/DataMapConverterTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/test/java/org/apache/cayenne/jpa/bridge/DataMapConverterTest.java?rev=609234&r1=609233&r2=609234&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/test/java/org/apache/cayenne/jpa/bridge/DataMapConverterTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/test/java/org/apache/cayenne/jpa/bridge/DataMapConverterTest.java Sat Jan  5 15:16:04 2008
@@ -44,6 +44,7 @@
 import org.apache.cayenne.jpa.map.JpaLifecycleCallback;
 import org.apache.cayenne.jpa.map.JpaPersistenceUnitDefaults;
 import org.apache.cayenne.jpa.map.JpaPersistenceUnitMetadata;
+import org.apache.cayenne.jpa.map.JpaTable;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
@@ -99,9 +100,13 @@
                 new MockPersistenceUnitInfo());
         JpaEntityMap jpaMap = context.getEntityMap();
 
+        JpaTable table = new JpaTable();
+        table.setName("ET1");
+        
         JpaEntity jpaEntity = new JpaEntity();
         jpaEntity.setName("E1");
         jpaEntity.setClassName("abc.C2");
+        jpaEntity.setTable(table);
         jpaEntity.setPostLoad(new JpaLifecycleCallback("xpl2"));
         jpaEntity.setPreRemove(new JpaLifecycleCallback("xpr2"));
         jpaMap.getEntities().add(jpaEntity);
@@ -128,9 +133,13 @@
                 new MockPersistenceUnitInfo());
         JpaEntityMap jpaMap = context.getEntityMap();
 
+        JpaTable table = new JpaTable();
+        table.setName("ET1");
+        
         JpaEntity jpaEntity = new JpaEntity();
         jpaEntity.setName("E1");
         jpaEntity.setClassName("abc.C2");
+        jpaEntity.setTable(table);
         jpaEntity.setPostLoad(new JpaLifecycleCallback("xpl2"));
         jpaEntity.setPreRemove(new JpaLifecycleCallback("xpr2"));
         jpaMap.getEntities().add(jpaEntity);