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/24 19:05:06 UTC
svn commit: r606720 - in /cayenne/main/trunk/framework:
cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/conf/
cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/
cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/
Author: aadamchik
Date: Mon Dec 24 10:05:00 2007
New Revision: 606720
URL: http://svn.apache.org/viewvc?rev=606720&view=rev
Log:
JPA: adding extra step - connecting reverse relationships on Cayenne end for consistent runtime...
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/conf/RuntimeLoadDelegate.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/DbRelationship.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/EntityResolver.java
cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/Provider.java
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/conf/RuntimeLoadDelegate.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/conf/RuntimeLoadDelegate.java?rev=606720&r1=606719&r2=606720&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/conf/RuntimeLoadDelegate.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/conf/RuntimeLoadDelegate.java Mon Dec 24 10:05:00 2007
@@ -25,19 +25,13 @@
import javax.sql.DataSource;
-import org.apache.cayenne.CayenneRuntimeException;
import org.apache.cayenne.ConfigurationException;
import org.apache.cayenne.access.DataDomain;
import org.apache.cayenne.access.DataNode;
import org.apache.cayenne.dba.AutoAdapter;
import org.apache.cayenne.dba.DbAdapter;
import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.map.Entity;
import org.apache.cayenne.map.MapLoader;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.map.ObjRelationship;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.xml.sax.InputSource;
@@ -360,7 +354,7 @@
if (adapterName != null) {
try {
ClassLoader cl = Thread.currentThread().getContextClassLoader();
- Class dbAdapterClass = Class.forName(adapterName, true, cl);
+ Class<?> dbAdapterClass = Class.forName(adapterName, true, cl);
node.setAdapter((DbAdapter) dbAdapterClass.newInstance());
return;
}
@@ -463,7 +457,7 @@
// load missing relationships and update configuration object
for (DataDomain domain : getDomains().values()) {
- updateDefaults(domain);
+ domain.getEntityResolver().updateDefaults();
config.addDomain(domain);
}
@@ -474,86 +468,6 @@
+ " ms.");
}
- /**
- * Updates missing mapping artefacts that can be guessed from other mapping
- * information. This implementation creates missing reverse relationships, marking
- * newly created relationships as "runtime".
- *
- * @since 3.0
- */
- protected void updateDefaults(DataDomain domain) {
-
- // connect DB layer
- for (DataMap map : domain.getDataMaps()) {
-
- for (DbEntity entity : map.getDbEntities()) {
-
- // iterate by copy to avoid concurrency modification errors on reflexive
- // relationships
- Object[] relationships = entity.getRelationships().toArray();
- for (int i = 0; i < relationships.length; i++) {
- DbRelationship relationship = (DbRelationship) relationships[i];
- if (relationship.getReverseRelationship() == null) {
- DbRelationship reverse = relationship.createReverseRelationship();
-
- Entity targetEntity = reverse.getSourceEntity();
- reverse.setName(makeUniqueRelationshipName(targetEntity));
- reverse.setRuntime(true);
- targetEntity.addRelationship(reverse);
-
- logger.info("added runtime complimentary DbRelationship from "
- + targetEntity.getName()
- + " to "
- + reverse.getTargetEntityName());
- }
- }
- }
- }
-
- // connect object layer
- for (DataMap map : domain.getDataMaps()) {
-
- for (ObjEntity entity : map.getObjEntities()) {
-
- // iterate by copy to avoid concurrency modification errors on reflexive
- // relationships
- Object[] relationships = entity.getRelationships().toArray();
- for (int i = 0; i < relationships.length; i++) {
- ObjRelationship relationship = (ObjRelationship) relationships[i];
- if (relationship.getReverseRelationship() == null) {
- ObjRelationship reverse = relationship
- .createReverseRelationship();
-
- Entity targetEntity = reverse.getSourceEntity();
- reverse.setName(makeUniqueRelationshipName(targetEntity));
- reverse.setRuntime(true);
- targetEntity.addRelationship(reverse);
-
- logger.info("added runtime complimentary ObjRelationship from "
- + targetEntity.getName()
- + " to "
- + reverse.getTargetEntityName());
- }
- }
- }
- }
- }
-
- private String makeUniqueRelationshipName(Entity entity) {
- for (int i = 0; i < 1000; i++) {
- String name = "runtimeRelationship" + i;
- if(entity.getRelationship(name) == null) {
- return name;
- }
- }
-
- throw new CayenneRuntimeException(
- "Could not come up with a unique relationship name");
- }
-
- /**
- * @see org.apache.cayenne.conf.ConfigLoaderDelegate#startedLoading()
- */
public void startedLoading() {
startTime = System.currentTimeMillis();
logger.info("started configuration loading.");
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/DbRelationship.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/DbRelationship.java?rev=606720&r1=606719&r2=606720&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/DbRelationship.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/DbRelationship.java Mon Dec 24 10:05:00 2007
@@ -142,14 +142,24 @@
* @since 1.0.5
*/
public DbRelationship createReverseRelationship() {
+ DbEntity targetEntity = (DbEntity) getTargetEntity();
+
DbRelationship reverse = new DbRelationship();
- reverse.setSourceEntity(getTargetEntity());
+ reverse.setSourceEntity(targetEntity);
reverse.setTargetEntityName(getSourceEntity().getName());
- // TODO: must set toDepPK correctly
- // must set toMany correctly
+ // TODO: andrus 12/24/2007 - one more case to handle - set reverse toDepPK = true
+ // if this relationship toDepPK is false, but the entities are joined on a PK...
+ // on the other hand, these can still be two independent entities...
- reverse.setToMany(!toMany);
+ if (isToDependentPK()
+ && !toMany
+ && joins.size() == targetEntity.getPrimaryKeys().size()) {
+ reverse.setToMany(false);
+ }
+ else {
+ reverse.setToMany(!toMany);
+ }
for (DbJoin join : joins) {
DbJoin reverseJoin = join.createReverseJoin();
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/EntityResolver.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/EntityResolver.java?rev=606720&r1=606719&r2=606720&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/EntityResolver.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/EntityResolver.java Mon Dec 24 10:05:00 2007
@@ -103,6 +103,83 @@
}
/**
+ * Updates missing mapping artifacts that can be guessed from other mapping
+ * information. This implementation creates missing reverse relationships, marking
+ * newly created relationships as "runtime".
+ *
+ * @since 3.0
+ */
+ public void updateDefaults() {
+
+ // connect DB layer
+ for (DataMap map : getDataMaps()) {
+
+ for (DbEntity entity : map.getDbEntities()) {
+
+ // iterate by copy to avoid concurrency modification errors on reflexive
+ // relationships
+ Object[] relationships = entity.getRelationships().toArray();
+ for (int i = 0; i < relationships.length; i++) {
+ DbRelationship relationship = (DbRelationship) relationships[i];
+ if (relationship.getReverseRelationship() == null) {
+ DbRelationship reverse = relationship.createReverseRelationship();
+
+ Entity targetEntity = reverse.getSourceEntity();
+ reverse.setName(makeUniqueRelationshipName(targetEntity));
+ reverse.setRuntime(true);
+ targetEntity.addRelationship(reverse);
+
+ logger.info("added runtime complimentary DbRelationship from "
+ + targetEntity.getName()
+ + " to "
+ + reverse.getTargetEntityName());
+ }
+ }
+ }
+ }
+
+ // connect object layer
+ for (DataMap map : getDataMaps()) {
+
+ for (ObjEntity entity : map.getObjEntities()) {
+
+ // iterate by copy to avoid concurrency modification errors on reflexive
+ // relationships
+ Object[] relationships = entity.getRelationships().toArray();
+ for (int i = 0; i < relationships.length; i++) {
+ ObjRelationship relationship = (ObjRelationship) relationships[i];
+ if (relationship.getReverseRelationship() == null) {
+ ObjRelationship reverse = relationship
+ .createReverseRelationship();
+
+ Entity targetEntity = reverse.getSourceEntity();
+ reverse.setName(makeUniqueRelationshipName(targetEntity));
+ reverse.setRuntime(true);
+ targetEntity.addRelationship(reverse);
+
+ logger.info("added runtime complimentary ObjRelationship from "
+ + targetEntity.getName()
+ + " to "
+ + reverse.getTargetEntityName());
+ }
+ }
+ }
+ }
+ }
+
+ private String makeUniqueRelationshipName(Entity entity) {
+ for (int i = 0; i < 1000; i++) {
+ String name = "runtimeRelationship" + i;
+ if (entity.getRelationship(name) == null) {
+ return name;
+ }
+ }
+
+ throw new CayenneRuntimeException(
+ "Could not come up with a unique relationship name");
+ }
+
+ /**
* Compiles internal callback registry.
*/
synchronized void initCallbacks() {
@@ -273,7 +350,7 @@
return c;
}
-
+
/**
* @since 3.0
*/
@@ -447,8 +524,7 @@
// build inheritance tree... include nodes that
// have no children to avoid unneeded cache rebuilding on lookup...
- EntityInheritanceTree node = entityInheritanceCache
- .get(oe.getName());
+ EntityInheritanceTree node = entityInheritanceCache.get(oe.getName());
if (node == null) {
node = new EntityInheritanceTree(oe);
entityInheritanceCache.put(oe.getName(), node);
@@ -541,8 +617,7 @@
*/
public EntityInheritanceTree lookupInheritanceTree(ObjEntity entity) {
- EntityInheritanceTree tree = entityInheritanceCache
- .get(entity.getName());
+ EntityInheritanceTree tree = entityInheritanceCache.get(entity.getName());
if (tree == null) {
// since we keep inheritance trees for all entities, null means
Modified: cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/Provider.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/Provider.java?rev=606720&r1=606719&r2=606720&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/Provider.java (original)
+++ cayenne/main/trunk/framework/cayenne-jpa-unpublished/src/main/java/org/apache/cayenne/jpa/Provider.java Mon Dec 24 10:05:00 2007
@@ -274,6 +274,7 @@
node.addDataMap(cayenneMap);
domain.addNode(node);
+ domain.getEntityResolver().updateDefaults();
domain.setUsingExternalTransactions(isJTA);
if ("true".equalsIgnoreCase(unit.getProperties().getProperty(