You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by fa...@apache.org on 2009/01/23 20:48:10 UTC

svn commit: r737164 - /openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/EmbedValueHandler.java

Author: faywang
Date: Fri Jan 23 11:48:10 2009
New Revision: 737164

URL: http://svn.apache.org/viewvc?rev=737164&view=rev
Log:
OPENJPA-851: fix a bug in the embeddable processing.

Modified:
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/EmbedValueHandler.java

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/EmbedValueHandler.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/EmbedValueHandler.java?rev=737164&r1=737163&r2=737164&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/EmbedValueHandler.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/EmbedValueHandler.java Fri Jan 23 11:48:10 2009
@@ -23,10 +23,8 @@
 import java.util.List;
 
 import org.apache.openjpa.enhance.PersistenceCapable;
-import org.apache.openjpa.enhance.StateManager;
 import org.apache.openjpa.jdbc.kernel.JDBCFetchConfiguration;
 import org.apache.openjpa.jdbc.kernel.JDBCStore;
-import org.apache.openjpa.jdbc.meta.ClassMapping;
 import org.apache.openjpa.jdbc.meta.Embeddable;
 import org.apache.openjpa.jdbc.meta.FieldMapping;
 import org.apache.openjpa.jdbc.meta.FieldStrategy;
@@ -34,7 +32,6 @@
 import org.apache.openjpa.jdbc.schema.Column;
 import org.apache.openjpa.jdbc.schema.ColumnIO;
 import org.apache.openjpa.kernel.OpenJPAStateManager;
-import org.apache.openjpa.kernel.StateManagerImpl;
 import org.apache.openjpa.lib.util.Localizer;
 import org.apache.openjpa.util.MetaDataException;
 
@@ -109,12 +106,26 @@
      */
     protected Object toDataStoreValue(OpenJPAStateManager em, ValueMapping vm,
             JDBCStore store, Column[] cols, Object rval, int idx) {
-        toDataStoreValue1(em, vm, store, cols, rval, idx);
-        return rval;
+        
+        // This is a placeholder to hold the value generated in 
+        // toDataStoreValue1. When this method is called from 
+        // ElementEmbedValueHandler or ObjectIdValueHandler, 
+        // if the dimension of cols > 1, rval is an array of the 
+        // same dimension. If the dimension of cols is 1, rval is null.
+        // If rval is not null, it is an array of objects and this array
+        // will be populated in toDatastoreValue1. If rval is null,
+        // a new value will be added to rvals in toDataStoreValue1
+        // and return to the caller.
+        List rvals = new ArrayList();
+        if (rval != null)
+            rvals.add(rval);
+        
+        toDataStoreValue1(em, vm, store, cols, rvals, idx);
+        return rvals.get(0);
     }    
     
     protected int toDataStoreValue1(OpenJPAStateManager em, ValueMapping vm,
-        JDBCStore store, Column[] cols, Object rval, int idx) {
+        JDBCStore store, Column[] cols, List rvals, int idx) {
         // set rest of columns from fields
         FieldMapping[] fms = vm.getEmbeddedMapping().getFieldMappings();
         Object cval;
@@ -124,13 +135,20 @@
             if (fms[i].getManagement() != FieldMapping.MANAGE_PERSISTENT)
                 continue;
             
+            // This recursive code is mainly to deal with situations
+            // where an entity contains a collection of embeddableA.
+            // The embeddableA element in the collection contains an 
+            // embeddableB. The parameter vm to toDataStoreValue is 
+            // embeddableA. If some field in embeddableA is of type 
+            // embeddableB, recursive call is required to populate the 
+            // value for embeddableB.
             ValueMapping val = fms[i].getValueMapping();
             if (val.getEmbeddedMapping() != null) {
                 cval = (em == null) ? null : em.fetch(i);
                 if (cval instanceof PersistenceCapable) {
                     OpenJPAStateManager embedSm = (OpenJPAStateManager)
                         ((PersistenceCapable)cval).pcGetStateManager();
-                    idx = toDataStoreValue1(embedSm, val, store, cols, rval, idx);
+                    idx = toDataStoreValue1(embedSm, val, store, cols, rvals, idx);
                 }
             }
             
@@ -141,11 +159,14 @@
 
             cval = (em == null) ? null : em.fetch(i);
             cval = embed.toEmbeddedDataStoreValue(cval, store);
-            if (cols.length == 1)
-                rval = cval;
-            else if (ecols.length == 1)
+            if (cols.length == 1) {
+                // rvals is empty
+                rvals.add(cval); // save the return value
+            } else if (ecols.length == 1) {
+                Object rval = rvals.get(0);
                 ((Object[]) rval)[idx++] = cval;
-            else {
+            } else {
+                Object rval = rvals.get(0);
                 System.arraycopy(cval, 0, rval, idx, ecols.length);
                 idx += ecols.length;
             }