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);