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/09/10 23:50:08 UTC

svn commit: r813605 - in /openjpa/trunk: openjpa-kernel/src/main/java/org/apache/openjpa/conf/ openjpa-kernel/src/main/java/org/apache/openjpa/meta/ openjpa-persistence/src/main/java/org/apache/openjpa/persistence/

Author: faywang
Date: Thu Sep 10 21:50:08 2009
New Revision: 813605

URL: http://svn.apache.org/viewvc?rev=813605&view=rev
Log:
OPENJPA-1286: use Compatibility to check if the relationship defined in the MappedSuperclass must be uni-directional.

Modified:
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/Compatibility.java
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/FieldMetaData.java
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataDefaults.java
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/NoneMetaDataFactory.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataDefaults.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceProductDerivation.java

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/Compatibility.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/Compatibility.java?rev=813605&r1=813604&r2=813605&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/Compatibility.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/Compatibility.java Thu Sep 10 21:50:08 2009
@@ -62,6 +62,7 @@
     private boolean _privatePersistentProperties = false;
     private boolean _autoOff = true;
     private boolean _superclassDiscriminatorStrategyByDefault = true;
+    private boolean _isAbstractMappingUniDirectional = true;
     
     /**
      * Whether to require exact identity value types when creating object
@@ -418,6 +419,36 @@
      */
     public void setPrivatePersistentProperties(boolean privateProps) {
         _privatePersistentProperties = privateProps;
-    }    
+    }
+    
+    /**
+     * Whether OpenJPA allows bi-directional relationship in the MappedSuperclass.
+     * Prior to OpenJPA 2.0, the bi-directional relationship in the MappedSuperclass,
+     * is not blocked. This is contrary to the JPA specification, which states that 
+     * Persistent relationships defined by a mapped superclass must be
+     * unidirectional.
+     * 
+     * @param isAbstractMappingUniDirectional true if relationship defined in the 
+     *        MappedSuperclass must be uni-directional
+     * @since 2.0.0
+     */
+    public void setAbstractMappingUniDirectional(boolean isAbstractMappingUniDirectional) {
+        _isAbstractMappingUniDirectional = isAbstractMappingUniDirectional;
+    }
+
+    
+    /**
+     * Whether OpenJPA allows bi-directional relationship in the MappedSuperclass.
+     * Prior to OpenJPA 2.0, the bi-directional relationship in the MappedSuperclass,
+     * is not blocked. This is contrary to the JPA specification, which states that 
+     * Persistent relationships defined by a mapped superclass must be
+     * unidirectional. The default value is true.
+     * 
+     * @since 2.0.0
+     */
+    public boolean isAbstractMappingUniDirectional() {
+        return _isAbstractMappingUniDirectional;
+    }
+
 }
 

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/FieldMetaData.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/FieldMetaData.java?rev=813605&r1=813604&r2=813605&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/FieldMetaData.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/FieldMetaData.java Thu Sep 10 21:50:08 2009
@@ -48,7 +48,6 @@
 import org.apache.commons.collections.comparators.ComparatorChain;
 import org.apache.commons.lang.StringUtils;
 import org.apache.openjpa.conf.OpenJPAConfiguration;
-import org.apache.openjpa.conf.Specification;
 import org.apache.openjpa.kernel.OpenJPAStateManager;
 import org.apache.openjpa.kernel.StoreContext;
 import org.apache.openjpa.lib.conf.Configurations;
@@ -859,18 +858,17 @@
             if (field.getMappedBy() != null)
                 throw new MetaDataException(_loc.get("circ-mapped-by", this,
                     _mappedBy));
-            Specification spec = getRepository().getConfiguration().getSpecificationInstance();
-            if (spec != null) {
-                int specVersion = spec.getVersion();
-                if (specVersion >= 2) {
-                    if (field.getDeclaringMetaData().isAbstract())
-                        throw new MetaDataException(_loc.get("no-mapped-by-in-mapped-super", field,
-                                field.getDeclaringMetaData()));
-
-                    if (this.getDeclaringMetaData().isAbstract())
-                        throw new MetaDataException(_loc.get("no-mapped-by-in-mapped-super", this,
-                                this.getDeclaringMetaData()));
-                }            
+            OpenJPAConfiguration conf = getRepository().getConfiguration();
+            boolean isAbstractMappingUniDirectional = getRepository().getMetaDataFactory().
+                    getDefaults().isAbstractMappingUniDirectional(conf);
+            if (isAbstractMappingUniDirectional) {
+                if (field.getDeclaringMetaData().isAbstract())
+                    throw new MetaDataException(_loc.get("no-mapped-by-in-mapped-super", field,
+                            field.getDeclaringMetaData()));
+
+                if (this.getDeclaringMetaData().isAbstract())
+                    throw new MetaDataException(_loc.get("no-mapped-by-in-mapped-super", this,
+                            this.getDeclaringMetaData()));
             }
             _mappedByMeta = field;
         }

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataDefaults.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataDefaults.java?rev=813605&r1=813604&r2=813605&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataDefaults.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/MetaDataDefaults.java Thu Sep 10 21:50:08 2009
@@ -20,6 +20,7 @@
 
 import java.lang.reflect.Member;
 
+import org.apache.openjpa.conf.OpenJPAConfiguration;
 import org.apache.openjpa.event.CallbackModes;
 
 /**
@@ -105,4 +106,12 @@
      * managed interface methods.
      */
     public Class getUnimplementedExceptionType();
+    
+    /**
+     * Whether the relationship in MappedSuper class must be
+     * uni-directional.  
+     * @return 2.0.0
+     */
+    public boolean isAbstractMappingUniDirectional(OpenJPAConfiguration conf);
+
 }

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/NoneMetaDataFactory.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/NoneMetaDataFactory.java?rev=813605&r1=813604&r2=813605&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/NoneMetaDataFactory.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/NoneMetaDataFactory.java Thu Sep 10 21:50:08 2009
@@ -24,6 +24,7 @@
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.openjpa.conf.OpenJPAConfiguration;
 import org.apache.openjpa.lib.meta.ClassArgParser;
 
 /**
@@ -157,4 +158,8 @@
     public Class<?> getManagedClass(Class<?> c) {
         return null;
     }
+
+    public boolean isAbstractMappingUniDirectional(OpenJPAConfiguration conf) {
+        return true;
+    }
 }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataDefaults.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataDefaults.java?rev=813605&r1=813604&r2=813605&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataDefaults.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataDefaults.java Thu Sep 10 21:50:08 2009
@@ -131,7 +131,8 @@
     protected AnnotatedFilter annotatedFilter = new AnnotatedFilter();
     protected GetterFilter getterFilter = new GetterFilter();
     protected SetterFilter setterFilter = new SetterFilter();
-
+    private Boolean _isAbstractMappingUniDirectional = null;
+    
     public PersistenceMetaDataDefaults() {
         setCallbackMode(CALLBACK_RETHROW | CALLBACK_ROLLBACK |
             CALLBACK_FAIL_FAST);
@@ -861,4 +862,14 @@
     String toMethodNames(List<Method> methods) {
     	return methods.toString();
     }
+    
+    public boolean isAbstractMappingUniDirectional(OpenJPAConfiguration conf) {
+        if (_isAbstractMappingUniDirectional == null)
+            setAbstractMappingUniDirectional(conf);
+        return _isAbstractMappingUniDirectional;
+    }
+    
+    public void setAbstractMappingUniDirectional(OpenJPAConfiguration conf) {
+        _isAbstractMappingUniDirectional = conf.getCompatibilityInstance().isAbstractMappingUniDirectional();
+    }
 }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceProductDerivation.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceProductDerivation.java?rev=813605&r1=813604&r2=813605&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceProductDerivation.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceProductDerivation.java Thu Sep 10 21:50:08 2009
@@ -35,9 +35,9 @@
 import java.util.MissingResourceException;
 import java.util.Set;
 
-import javax.persistence.spi.ValidationMode;
 import javax.persistence.spi.PersistenceUnitInfo;
 import javax.persistence.spi.PersistenceUnitTransactionType;
+import javax.persistence.spi.ValidationMode;
 
 import org.apache.commons.lang.StringUtils;
 import org.apache.openjpa.conf.Compatibility;
@@ -45,7 +45,6 @@
 import org.apache.openjpa.conf.OpenJPAConfigurationImpl;
 import org.apache.openjpa.conf.OpenJPAProductDerivation;
 import org.apache.openjpa.conf.Specification;
-import org.apache.openjpa.event.LifecycleEventManager;
 import org.apache.openjpa.kernel.MixedLockLevels;
 import org.apache.openjpa.lib.conf.AbstractProductDerivation;
 import org.apache.openjpa.lib.conf.Configuration;
@@ -58,10 +57,6 @@
 import org.apache.openjpa.lib.meta.XMLVersionParser;
 import org.apache.openjpa.lib.util.J2DoPrivHelper;
 import org.apache.openjpa.lib.util.Localizer;
-import org.apache.openjpa.persistence.validation.ValidatorImpl;
-import org.apache.openjpa.validation.Validator;
-import org.apache.openjpa.validation.ValidationException;
-import org.apache.openjpa.validation.ValidatingLifecycleEventManager;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 
@@ -187,6 +182,7 @@
             compatibility.setFlushBeforeDetach(true);
             compatibility.setCopyOnDetach(true);
             compatibility.setPrivatePersistentProperties(true);
+            compatibility.setAbstractMappingUniDirectional(false);
             // Disable bean validation for spec level < 2 configurations
             conf.validationMode.set(String.valueOf(ValidationMode.NONE));
         }