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 2007/12/23 23:12:07 UTC
svn commit: r606626 - in
/cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa:
bridge/DataMapConverter.java map/JpaEntity.java
Author: aadamchik
Date: Sun Dec 23 14:12:07 2007
New Revision: 606626
URL: http://svn.apache.org/viewvc?rev=606626&view=rev
Log:
CAY-948 Implement flattened attributes in Cayenne
(support for SecondaryTable when bridging JPA to DataMap)
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/main/java/org/apache/cayenne/jpa/map/JpaEntity.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=606626&r1=606625&r2=606626&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 Sun Dec 23 14:12:07 2007
@@ -50,6 +50,7 @@
import org.apache.cayenne.jpa.map.JpaPersistenceUnitMetadata;
import org.apache.cayenne.jpa.map.JpaQueryHint;
import org.apache.cayenne.jpa.map.JpaRelationship;
+import org.apache.cayenne.jpa.map.JpaSecondaryTable;
import org.apache.cayenne.jpa.map.JpaTable;
import org.apache.cayenne.jpa.map.JpaVersion;
import org.apache.cayenne.map.DataMap;
@@ -160,6 +161,10 @@
return visitor;
}
+ private String getSecondaryTableDbRelationshipName(String secondaryTableName) {
+ return "$cay_secondary_" + secondaryTableName;
+ }
+
private EntityListener makeEntityListener(JpaEntityListener jpaListener) {
EntityListener listener = new EntityListener(jpaListener.getClassName());
@@ -329,6 +334,7 @@
@Override
Object createObject(ProjectPath path) {
+ JpaManagedClass entity = path.firstInstanceOf(JpaManagedClass.class);
JpaBasic jpaBasic = (JpaBasic) path.getObject();
ObjEntity parentCayenneEntity = (ObjEntity) targetPath.getObject();
@@ -336,7 +342,8 @@
ObjAttribute cayenneAttribute = new ObjAttribute(jpaBasic.getName());
cayenneAttribute
.setType(getAttributeType(path, jpaBasic.getName()).getName());
- cayenneAttribute.setDbAttributeName(jpaBasic.getColumn().getName());
+ cayenneAttribute.setDbAttributePath(getAttributePath(path, entity, jpaBasic
+ .getColumn()));
parentCayenneEntity.addAttribute(cayenneAttribute);
return cayenneAttribute;
@@ -375,6 +382,38 @@
}
}
+ protected String getAttributePath(
+ ProjectPath path,
+ JpaManagedClass managedClass,
+ JpaColumn column) {
+
+ if (managedClass instanceof JpaEntity) {
+ JpaEntity entity = (JpaEntity) managedClass;
+
+ if (column.getTable().equals(entity.getTable().getName())) {
+ return column.getName();
+ }
+
+ JpaSecondaryTable table = entity.getSecondaryTable(column.getTable());
+ if (table == null) {
+ recordConflict(path, "Unrecognized secondary table: '"
+ + column.getTable()
+ + "'");
+ return column.getName();
+ }
+
+ return getSecondaryTableDbRelationshipName(table.getName())
+ + '.'
+ + column.getName();
+ }
+ else {
+ // TODO: andrus, 12/23/2007 this would miss a case if a user decides to
+ // specify a secondary table on an abstract superclass that is not linked
+ // to a table yet ... which would be quite crazy, but still...
+ return column.getName();
+ }
+ }
+
}
class JpaVersionVisitor extends JpaBasicVisitor {
@@ -382,13 +421,15 @@
@Override
Object createObject(ProjectPath path) {
+ JpaManagedClass entity = path.firstInstanceOf(JpaManagedClass.class);
JpaVersion version = (JpaVersion) path.getObject();
ObjEntity parentCayenneEntity = (ObjEntity) targetPath.getObject();
ObjAttribute cayenneAttribute = new ObjAttribute(version.getName());
cayenneAttribute.setType(getAttributeType(path, version.getName()).getName());
- cayenneAttribute.setDbAttributeName(version.getColumn().getName());
+ cayenneAttribute.setDbAttributePath(getAttributePath(path, entity, version
+ .getColumn()));
parentCayenneEntity.addAttribute(cayenneAttribute);
return cayenneAttribute;
@@ -462,7 +503,9 @@
ObjAttribute cayenneAttribute = new ObjAttribute(id.getName());
cayenneAttribute.setType(getAttributeType(path, id.getName()).getName());
- cayenneAttribute.setDbAttributeName(id.getColumn().getName());
+
+ // assuming id's can not be flattened to another table...
+ cayenneAttribute.setDbAttributePath(id.getColumn().getName());
parentCayenneEntity.addAttribute(cayenneAttribute);
return cayenneAttribute;
@@ -618,6 +661,7 @@
addChildVisitor(JpaAttributes.class, attributeVisitor);
addChildVisitor(JpaTable.class, new JpaTableVisitor());
+ addChildVisitor(JpaSecondaryTable.class, new JpaSecondaryTableVisitor());
addChildVisitor(JpaNamedQuery.class, new JpaNamedQueryVisitor());
addChildVisitor(JpaEntityListeners.class, listenersVisitor);
}
@@ -858,13 +902,44 @@
jpaTable.getName());
if (cayenneEntity == null) {
cayenneEntity = new DbEntity(jpaTable.getName());
+ cayenneEntity.setCatalog(jpaTable.getCatalog());
+ cayenneEntity.setSchema(jpaTable.getSchema());
parentCayenneEntity.getDataMap().addDbEntity(cayenneEntity);
}
- cayenneEntity.setCatalog(jpaTable.getCatalog());
- cayenneEntity.setSchema(jpaTable.getSchema());
-
parentCayenneEntity.setDbEntity(cayenneEntity);
+ return cayenneEntity;
+ }
+ }
+
+ class JpaSecondaryTableVisitor extends NestedVisitor {
+
+ @Override
+ Object createObject(ProjectPath path) {
+
+ JpaSecondaryTable jpaTable = (JpaSecondaryTable) path.getObject();
+ ObjEntity parentCayenneEntity = (ObjEntity) targetPath.getObject();
+
+ DbEntity cayenneEntity = parentCayenneEntity.getDataMap().getDbEntity(
+ jpaTable.getName());
+ if (cayenneEntity == null) {
+ cayenneEntity = new DbEntity(jpaTable.getName());
+ cayenneEntity.setCatalog(jpaTable.getCatalog());
+ cayenneEntity.setSchema(jpaTable.getSchema());
+
+ parentCayenneEntity.getDataMap().addDbEntity(cayenneEntity);
+ }
+
+ // create a relationship between master DbEntity and a secondary DbEntity...
+ DbEntity masterEntity = parentCayenneEntity.getDbEntity();
+
+ JpaDbRelationship dbRelationship = new JpaDbRelationship(
+ getSecondaryTableDbRelationshipName(cayenneEntity.getName()));
+ dbRelationship.setTargetEntityName(cayenneEntity.getName());
+ dbRelationship.setToMany(false);
+
+ masterEntity.addRelationship(dbRelationship);
+
return cayenneEntity;
}
}
Modified: cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/map/JpaEntity.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/map/JpaEntity.java?rev=606626&r1=606625&r2=606626&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/map/JpaEntity.java (original)
+++ cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/map/JpaEntity.java Sun Dec 23 14:12:07 2007
@@ -323,6 +323,18 @@
}
return secondaryTables;
}
+
+ public JpaSecondaryTable getSecondaryTable(String name) {
+ if (secondaryTables != null) {
+ for(JpaSecondaryTable table : secondaryTables) {
+ if(name.equals(table.getName())) {
+ return table;
+ }
+ }
+ }
+
+ return null;
+ }
@Override
public String toString() {