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 2010/10/19 18:14:52 UTC

svn commit: r1024306 - in /openjpa/trunk: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/annotations/

Author: faywang
Date: Tue Oct 19 16:14:51 2010
New Revision: 1024306

URL: http://svn.apache.org/viewvc?rev=1024306&view=rev
Log:
OPENJPA-1837: fix the MaxEmbeddedLobFieldStrategy when there is limitation of max lob size and when the field is in an embeddable which is contained in an element collection. 

Modified:
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingRepository.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/EmbedValueHandler.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/HandlerFieldStrategy.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/MaxEmbeddedBlobFieldStrategy.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/MaxEmbeddedByteArrayFieldStrategy.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/MaxEmbeddedCharArrayFieldStrategy.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/MaxEmbeddedClobFieldStrategy.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/MaxEmbeddedLobFieldStrategy.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/annotations/EmbedOwner.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/annotations/TestEJBEmbedded.java

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingRepository.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingRepository.java?rev=1024306&r1=1024305&r2=1024306&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingRepository.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingRepository.java Tue Oct 19 16:14:51 2010
@@ -842,8 +842,14 @@ public class MappingRepository extends M
         }
 
         if (field.isSerialized()) {
-            if (_dict.maxEmbeddedBlobSize != -1)
+            if (_dict.maxEmbeddedBlobSize != -1) {
+                handler = defaultHandler(field, adapting);
+                if (handler != null) {
+                    if (installHandlers)
+                        field.setHandler(handler);
+                }
                 return new MaxEmbeddedBlobFieldStrategy();
+            }
         } else {
             // check for mapped strategy
             Object strat = mappedStrategy(field, field.getType(), adapting);
@@ -859,18 +865,36 @@ public class MappingRepository extends M
         // check for known field strategies
         if (!field.isSerialized() && (field.getType() == byte[].class
             || field.getType() == Byte[].class)) {
-            if (_dict.maxEmbeddedBlobSize != -1)
+            if (_dict.maxEmbeddedBlobSize != -1) {
+                handler = defaultHandler(field, adapting);
+                if (handler != null) {
+                    if (installHandlers)
+                        field.setHandler(handler);
+                }
                 return new MaxEmbeddedByteArrayFieldStrategy();
+            }
         } else if (!field.isSerialized()
             && (field.getType() == char[].class
             || field.getType() == Character[].class)) {
-            if (_dict.maxEmbeddedClobSize != -1 && isClob(field, false))
+            if (_dict.maxEmbeddedClobSize != -1 && isClob(field, false)) {
+                handler = defaultHandler(field, adapting);
+                if (handler != null) {
+                    if (installHandlers)
+                        field.setHandler(handler);
+                }
                 return new MaxEmbeddedCharArrayFieldStrategy();
+            }
         } else if (!field.isSerialized()) {
             FieldStrategy strat = defaultTypeStrategy(field, installHandlers,
                 adapting);
-            if (strat != null)
+            if (strat != null) {
+                handler = defaultHandler(field, adapting);
+                if (handler != null) {
+                    if (installHandlers)
+                        field.setHandler(handler);
+                }
                 return strat;
+            }
         }
 
         // check for default handler

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=1024306&r1=1024305&r2=1024306&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 Tue Oct 19 16:14:51 2010
@@ -180,7 +180,7 @@ public abstract class EmbedValueHandler
             if (ecols.length == 0)
                 continue;
 
-            cval = (em == null) ? null : em.fetch(i);
+            cval = (em == null) ? null : getValue(embed, em, i);
             cval = embed.toEmbeddedDataStoreValue(cval, store);
             if (cols.length == 1) {
                 // rvals is empty
@@ -196,6 +196,13 @@ public abstract class EmbedValueHandler
         }
         return idx;
     }
+    
+    private Object getValue(Embeddable embed, OpenJPAStateManager sm, int idx) {
+        if (embed instanceof MaxEmbeddedLobFieldStrategy) {
+            return ((MaxEmbeddedLobFieldStrategy)embed).getValue(sm);
+        }
+        return sm.fetch(idx);
+    }
 
     /**
      * Helper to convert a datastore value to its object equivalent.

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/HandlerFieldStrategy.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/HandlerFieldStrategy.java?rev=1024306&r1=1024305&r2=1024306&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/HandlerFieldStrategy.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/HandlerFieldStrategy.java Tue Oct 19 16:14:51 2010
@@ -60,11 +60,11 @@ public class HandlerFieldStrategy
     private static final Localizer _loc = Localizer.forPackage
         (HandlerFieldStrategy.class);
 
-    private Column[] _cols = null;
-    private ColumnIO _io = null;
-    private Object[] _args = null;
-    private boolean _load = false;
-    private boolean _lob = false;
+    protected Column[] _cols = null;
+    protected ColumnIO _io = null;
+    protected Object[] _args = null;
+    protected boolean _load = false;
+    protected boolean _lob = false;
 
     public void map(boolean adapt) {
         if (field.getHandler() == null)

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/MaxEmbeddedBlobFieldStrategy.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/MaxEmbeddedBlobFieldStrategy.java?rev=1024306&r1=1024305&r2=1024306&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/MaxEmbeddedBlobFieldStrategy.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/MaxEmbeddedBlobFieldStrategy.java Tue Oct 19 16:14:51 2010
@@ -105,4 +105,13 @@ public class MaxEmbeddedBlobFieldStrateg
         _maxSize = dict.maxEmbeddedBlobSize;
         field.setUsesImplData(Boolean.TRUE);
     }
+    
+    protected Object getValue(OpenJPAStateManager sm) {
+        byte[] b = (byte[]) sm.getImplData(field.getIndex());
+        if (b == null || (b.length > _maxSize && !field.getColumns()[0].isNotNull()))
+            return null;
+        sm.setImplData(field.getIndex(), null);
+        DBDictionary.SerializedData dat = new DBDictionary.SerializedData(b);
+        return dat;
+    }    
 }

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/MaxEmbeddedByteArrayFieldStrategy.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/MaxEmbeddedByteArrayFieldStrategy.java?rev=1024306&r1=1024305&r2=1024306&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/MaxEmbeddedByteArrayFieldStrategy.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/MaxEmbeddedByteArrayFieldStrategy.java Tue Oct 19 16:14:51 2010
@@ -56,9 +56,8 @@ public class MaxEmbeddedByteArrayFieldSt
 
     protected void update(OpenJPAStateManager sm, Row row)
         throws SQLException {
-        byte[] b = PrimitiveWrapperArrays.toByteArray(sm.fetchObject
-            (field.getIndex()));
-        if (b == null || (b.length > _maxSize && !field.getColumns()[0].isNotNull()))
+        byte[] b = (byte[]) getValue(sm);
+         if (b == null)
             row.setBytes(field.getColumns()[0], null);
         else
             row.setBytes(field.getColumns()[0], b);
@@ -94,4 +93,12 @@ public class MaxEmbeddedByteArrayFieldSt
         DBDictionary dict = field.getMappingRepository().getDBDictionary();
         _maxSize = dict.maxEmbeddedBlobSize;
     }
+    
+    protected Object getValue(OpenJPAStateManager sm) {
+        byte[] b = PrimitiveWrapperArrays.toByteArray(sm.fetchObject
+                (field.getIndex()));
+        if (b == null || (b.length > _maxSize && !field.getColumns()[0].isNotNull()))
+            return null;
+        return b;
+    }    
 }

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/MaxEmbeddedCharArrayFieldStrategy.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/MaxEmbeddedCharArrayFieldStrategy.java?rev=1024306&r1=1024305&r2=1024306&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/MaxEmbeddedCharArrayFieldStrategy.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/MaxEmbeddedCharArrayFieldStrategy.java Tue Oct 19 16:14:51 2010
@@ -111,4 +111,13 @@ public class MaxEmbeddedCharArrayFieldSt
         DBDictionary dict = field.getMappingRepository().getDBDictionary();
         _maxSize = dict.maxEmbeddedClobSize;
     }
+    
+    protected Object getValue(OpenJPAStateManager sm) {
+        char[] c = PrimitiveWrapperArrays.
+        toCharArray(sm.fetchObject(field.getIndex()));
+        if (c == null || c.length > _maxSize)
+            return null;
+        else
+            return c;
+    }
 }

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/MaxEmbeddedClobFieldStrategy.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/MaxEmbeddedClobFieldStrategy.java?rev=1024306&r1=1024305&r2=1024306&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/MaxEmbeddedClobFieldStrategy.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/MaxEmbeddedClobFieldStrategy.java Tue Oct 19 16:14:51 2010
@@ -52,8 +52,8 @@ public class MaxEmbeddedClobFieldStrateg
 
     protected void update(OpenJPAStateManager sm, Row row)
         throws SQLException {
-        String s = sm.fetchString(field.getIndex());
-        if (s == null || (s.length() > _maxSize && !field.getColumns()[0].isNotNull()))
+        String s = (String) getValue(sm);
+        if (s == null)
             row.setNull(field.getColumns()[0], true);
         else
             row.setString(field.getColumns()[0], s);
@@ -81,4 +81,12 @@ public class MaxEmbeddedClobFieldStrateg
         DBDictionary dict = field.getMappingRepository().getDBDictionary();
         _maxSize = dict.maxEmbeddedClobSize;
     }
+    
+    protected Object getValue(OpenJPAStateManager sm) {
+        String s = sm.fetchString(field.getIndex());
+        if (s == null || (s.length() > _maxSize && !field.getColumns()[0].isNotNull())) {
+            return null;
+        }
+        return s;
+    }    
 }

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/MaxEmbeddedLobFieldStrategy.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/MaxEmbeddedLobFieldStrategy.java?rev=1024306&r1=1024305&r2=1024306&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/MaxEmbeddedLobFieldStrategy.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/MaxEmbeddedLobFieldStrategy.java Tue Oct 19 16:14:51 2010
@@ -46,7 +46,7 @@ import org.apache.openjpa.meta.JavaTypes
  * @since 0.4.0
  */
 abstract class MaxEmbeddedLobFieldStrategy
-    extends AbstractFieldStrategy {
+    extends HandlerFieldStrategy {
 
     /**
      * Return the expected type of the field from {@link JavaTypes} or
@@ -95,11 +95,13 @@ abstract class MaxEmbeddedLobFieldStrate
         tmpCol.setIdentifier(fieldName);
         tmpCol.setJavaType(getExpectedJavaType());
         tmpCol.setSize(-1);
-        Column[] cols = vinfo.getColumns(field, fieldName,
+        _cols = vinfo.getColumns(field, fieldName,
             new Column[]{ tmpCol }, field.getTable(), adapt);
-
-        field.setColumns(cols);
-        field.setColumnIO(vinfo.getColumnIO());
+        _io = vinfo.getColumnIO();
+        if (_io == null)
+            _io = field.getColumnIO();
+        field.setColumns(_cols);
+        field.setColumnIO(_io);
         field.mapConstraints(fieldName, adapt);
         field.mapPrimaryKey(adapt);
     }
@@ -266,4 +268,6 @@ abstract class MaxEmbeddedLobFieldStrate
         Object prevValue)
         throws SQLException {
     }
+    
+    protected abstract Object getValue(OpenJPAStateManager sm);
 }

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/annotations/EmbedOwner.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/annotations/EmbedOwner.java?rev=1024306&r1=1024305&r2=1024306&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/annotations/EmbedOwner.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/annotations/EmbedOwner.java Tue Oct 19 16:14:51 2010
@@ -86,4 +86,8 @@ public class EmbedOwner {
     public Set<EmbedValue> getEmbedCollection() {
         return embedCollection;
     }
+
+    public void setEmbedCollection(Set<EmbedValue> embedCollection) {
+        this.embedCollection = embedCollection;
+    }
 }

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/annotations/TestEJBEmbedded.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/annotations/TestEJBEmbedded.java?rev=1024306&r1=1024305&r2=1024306&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/annotations/TestEJBEmbedded.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/annotations/TestEJBEmbedded.java Tue Oct 19 16:14:51 2010
@@ -19,6 +19,7 @@
 package org.apache.openjpa.persistence.jdbc.annotations;
 
 import java.sql.Types;
+import java.util.HashSet;
 import java.util.Set;
 
 import javax.persistence.EntityManager;
@@ -70,6 +71,9 @@ public class TestEJBEmbedded extends Sin
         embed.setBlob("foobar".getBytes());
         embed.setOwner(owner);
         owner.setEmbed(embed);
+        Set<EmbedValue> embedVals = new HashSet<EmbedValue>();
+        embedVals.add(embed);
+        owner.setEmbedCollection(embedVals);
         em.persist(owner);
         int pk = owner.getPk();
         em.getTransaction().commit();