You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by ht...@apache.org on 2013/07/18 21:34:28 UTC

svn commit: r1504619 - in /openjpa/branches/2.1.x: ./ openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/jointable/onetomany/ openjpa-persistence-jdbc/src/test/java/...

Author: hthomann
Date: Thu Jul 18 19:34:28 2013
New Revision: 1504619

URL: http://svn.apache.org/r1504619
Log:
OPENJPA-1983: Don't cascade to an unloaded field when merge is called on a managed Entity - back ported Rick Curtis' trunk changes to 2.1.x.

Added:
    openjpa/branches/2.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/TestLazyFields.java
      - copied unchanged from r1504611, openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/TestLazyFields.java
    openjpa/branches/2.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/Inner.java
      - copied unchanged from r1504611, openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/Inner.java
    openjpa/branches/2.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/Outer.java
      - copied unchanged from r1504611, openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/merge/model/Outer.java
Modified:
    openjpa/branches/2.1.x/   (props changed)
    openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AttachManager.java
    openjpa/branches/2.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/jointable/onetomany/   (props changed)

Propchange: openjpa/branches/2.1.x/
------------------------------------------------------------------------------
  Merged /openjpa/branches/2.0.x:r1504611
  Merged /openjpa/trunk:r1095401,1095805

Modified: openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AttachManager.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AttachManager.java?rev=1504619&r1=1504618&r2=1504619&view=diff
==============================================================================
--- openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AttachManager.java (original)
+++ openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AttachManager.java Thu Jul 18 19:34:28 2013
@@ -19,6 +19,7 @@
 package org.apache.openjpa.kernel;
 
 import java.util.ArrayList;
+import java.util.BitSet;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
@@ -37,11 +38,11 @@ import org.apache.openjpa.meta.FieldMeta
 import org.apache.openjpa.meta.ValueMetaData;
 import org.apache.openjpa.util.CallbackException;
 import org.apache.openjpa.util.Exceptions;
+import org.apache.openjpa.util.ImplHelper;
 import org.apache.openjpa.util.OpenJPAException;
 import org.apache.openjpa.util.OptimisticException;
 import org.apache.openjpa.util.ProxyManager;
 import org.apache.openjpa.util.UserException;
-import org.apache.openjpa.util.ImplHelper;
 
 /**
  * Handles attaching instances.
@@ -59,7 +60,7 @@ public class AttachManager {
     private final boolean _copyNew;
     private final boolean _failFast;
     private final IdentityMap _attached = new IdentityMap();
-    private final Collection _visitedNodes = new ArrayList();
+    private final Collection<StateManagerImpl> _visitedNodes = new ArrayList();
 
     // reusable strategies
     private AttachStrategy _version;
@@ -253,17 +254,18 @@ public class AttachManager {
     }
 
     private Object handleCascade(Object toAttach, OpenJPAStateManager owner) {
-        FieldMetaData[] fields = _broker.getStateManager(toAttach).getMetaData()
-            .getDefinedFields();
-        for (int i = 0; i < fields.length; i++) {
-            FieldMetaData fd = (FieldMetaData) fields[i];
-            if (fd.getElement().getCascadeAttach() == fd.CASCADE_IMMEDIATE) {
-                FieldMetaData[] inverseFieldMappings = fd.getInverseMetaDatas();
+        StateManagerImpl sm = _broker.getStateManagerImpl(toAttach, true);
+        BitSet loaded = sm.getLoaded();
+        FieldMetaData[] fmds = sm.getMetaData().getDefinedFields();
+        for (FieldMetaData fmd : fmds) {
+            if (fmd.getElement().getCascadeAttach() == ValueMetaData.CASCADE_IMMEDIATE) {
+                FieldMetaData[] inverseFieldMappings = fmd.getInverseMetaDatas();
                 if (inverseFieldMappings.length != 0) {
-                    OpenJPAStateManager sm = _broker.getStateManager(toAttach);
                     _visitedNodes.add(sm);
-                    getStrategy(toAttach).attachField(this, toAttach,
-                        _broker.getStateManagerImpl(toAttach, true), fd, true);
+                    // Only try to attach this field is it is loaded
+                    if (loaded.get(fmd.getIndex())) {
+                        getStrategy(toAttach).attachField(this, toAttach, sm, fmd, true);
+                    }
                 }
             }
         }

Propchange: openjpa/branches/2.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/jointable/onetomany/
------------------------------------------------------------------------------
  Merged /openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/jointable/onetomany:r1504611