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(