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 2006/07/08 19:31:39 UTC

svn commit: r420169 - in /incubator/cayenne/main/trunk/cayenne/cayenne-java/src: cayenne/java/org/objectstyle/cayenne/access/ tests/java/org/objectstyle/cayenne/access/

Author: aadamchik
Date: Sat Jul  8 10:31:38 2006
New Revision: 420169

URL: http://svn.apache.org/viewvc?rev=420169&view=rev
Log:
CAY-592

Modified:
    incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataRowUtils.java
    incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectResolver.java
    incubator/cayenne/main/trunk/cayenne/cayenne-java/src/tests/java/org/objectstyle/cayenne/access/InheritanceTst.java

Modified: incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataRowUtils.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataRowUtils.java?rev=420169&r1=420168&r2=420169&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataRowUtils.java (original)
+++ incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/DataRowUtils.java Sat Jul  8 10:31:38 2006
@@ -249,7 +249,24 @@
                         || !diff.containsArcSnapshot(rel.getName())
                         || !Util.nullSafeEquals(id, diff.getArcSnapshotValue(rel
                                 .getName()))) {
-                    Object target = (id != null) ? context.localObject(id, null) : null;
+
+                    Object target;
+                    if (id == null) {
+                        target = null;
+                    }
+                    else {
+                        // if inheritance is involved, we can't use 'localObject' .. must
+                        // turn to fault instead
+                        ObjEntity targetEntity = (ObjEntity) rel.getTargetEntity();
+                        if (context.getEntityResolver().lookupInheritanceTree(
+                                targetEntity) != null) {
+                            target = Fault.getToOneFault();
+                        }
+                        else {
+                            target = context.localObject(id, null);
+                        }
+                    }
+
                     object.writeProperty(rel.getName(), target);
                 }
             }

Modified: incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectResolver.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectResolver.java?rev=420169&r1=420168&r2=420169&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectResolver.java (original)
+++ incubator/cayenne/main/trunk/cayenne/cayenne-java/src/cayenne/java/org/objectstyle/cayenne/access/ObjectResolver.java Sat Jul  8 10:31:38 2006
@@ -247,6 +247,12 @@
                     break;
                 }
             case PersistenceState.HOLLOW:
+                if(!refreshObjects) {
+                    DataRow cachedRow = cache.getCachedSnapshot(anId);
+                    if(cachedRow != null) {
+                        row = cachedRow;
+                    }
+                }
                 DataRowUtils.mergeObjectWithSnapshot(objectEntity, object, row);
                 object.setSnapshotVersion(row.getVersion());
             default:

Modified: incubator/cayenne/main/trunk/cayenne/cayenne-java/src/tests/java/org/objectstyle/cayenne/access/InheritanceTst.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/main/trunk/cayenne/cayenne-java/src/tests/java/org/objectstyle/cayenne/access/InheritanceTst.java?rev=420169&r1=420168&r2=420169&view=diff
==============================================================================
--- incubator/cayenne/main/trunk/cayenne/cayenne-java/src/tests/java/org/objectstyle/cayenne/access/InheritanceTst.java (original)
+++ incubator/cayenne/main/trunk/cayenne/cayenne-java/src/tests/java/org/objectstyle/cayenne/access/InheritanceTst.java Sat Jul  8 10:31:38 2006
@@ -58,6 +58,7 @@
 import java.util.Iterator;
 import java.util.List;
 
+import org.objectstyle.cayenne.DataObjectUtils;
 import org.objectstyle.cayenne.query.SelectQuery;
 import org.objectstyle.cayenne.testdo.inherit.AbstractPerson;
 import org.objectstyle.cayenne.testdo.inherit.Address;
@@ -130,7 +131,28 @@
 
         assertEquals(1, addresses.size());
         Address address = (Address) addresses.get(0);
-        assertSame(Manager.class, address.getToEmployee().getClass());
+        Employee e = address.getToEmployee();
+        
+        assertSame(Manager.class, e.getClass());
+    }
+    
+    public void testCAY592() throws Exception {
+        createTestData("testManagerAddress");
+        List addresses = context.performQuery(new SelectQuery(Address.class));
+
+        assertEquals(1, addresses.size());
+        Address address = (Address) addresses.get(0);
+        Employee e = address.getToEmployee();
+
+        // CAY-592 - make sure modification of the address in a parallel context 
+        // doesn't mess up the Manager
+        DataContext c2 = context.getParentDataDomain().createDataContext();
+        e = (Employee) DataObjectUtils.objectForPK(c2, e.getObjectId());
+        address = (Address) e.getAddresses().get(0);
+  
+        assertSame(e, address.getToEmployee());
+        address.setCity("XYZ");
+        assertSame(e, address.getToEmployee());
     }
 
     /**