Author: faywang
Date: Wed Sep 16 22:13:26 2009
New Revision: 815988

URL: http://svn.apache.org/viewvc?rev=815988&view=rev
Log:
OPENJPA-1253: allow JoinColumn in conjunction with OneToMany annotation

Added:
    
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/Bi_1ToM_FK.java
   (with props)
    
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/EntityC.java
   (with props)
Modified:
    
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationFieldStrategy.java
    
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java
    
openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/conf/Compatibility.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-jdbc/src/test/java/org/apache/openjpa/persistence/compat/TestSpecCompatibilityOptions.java
    
openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/persistence/compat/persistence_2_0.xml
    
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-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationFieldStrategy.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationFieldStrategy.java?rev=815988&r1=815987&r2=815988&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationFieldStrategy.java
 (original)
+++ 
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationFieldStrategy.java
 Wed Sep 16 22:13:26 2009
@@ -26,6 +26,7 @@
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.openjpa.conf.OpenJPAConfiguration;
 import org.apache.openjpa.enhance.PersistenceCapable;
 import org.apache.openjpa.enhance.ReflectingPersistenceCapable;
 import org.apache.openjpa.jdbc.kernel.JDBCFetchConfiguration;
@@ -133,6 +134,28 @@
 
             field.setUseClassCriteria(criteria);
             return;
+        } else { // this could be the owner in a bi-directional relation
+            OpenJPAConfiguration conf = 
field.getRepository().getConfiguration();
+            boolean isJoinColumnAllowedForToManyRelation = 
field.getRepository().
+                
getMetaDataFactory().getDefaults().isJoinColumnAllowedForToManyRelation(conf);
+            if (isJoinColumnAllowedForToManyRelation) { 
+                ClassMapping inverse = 
field.getValueMapping().getTypeMapping();
+                FieldMapping[] fmds = inverse.getFieldMappings();
+                for (int i = 0; i < fmds.length; i++) {
+                    if (field == fmds[i].getMappedByMapping()) {
+                        int typeCode = fmds[i].getDeclaredTypeCode(); 
+                        if (typeCode == JavaTypes.ARRAY ||
+                            typeCode == JavaTypes.COLLECTION ||
+                            typeCode == JavaTypes.MAP) {
+                            // this is a bi-directional oneToMany relation     
                    
+                            ValueMappingInfo info = field.getValueInfo();
+                            if (info.getColumns().size() == 0) 
+                                
info.setColumns(fmds[i].getValueInfo().getColumns());
+                        }
+                        break;
+                    }
+                }
+            }
         }
 
         // this is necessary to support openjpa 3 mappings, which didn't

Modified: 
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java?rev=815988&r1=815987&r2=815988&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java
 (original)
+++ 
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java
 Wed Sep 16 22:13:26 2009
@@ -22,6 +22,7 @@
 import java.util.Collection;
 import java.util.Iterator;
 
+import org.apache.openjpa.conf.OpenJPAConfiguration;
 import org.apache.openjpa.jdbc.kernel.JDBCFetchConfiguration;
 import org.apache.openjpa.jdbc.kernel.JDBCStore;
 import org.apache.openjpa.jdbc.meta.ClassMapping;
@@ -106,7 +107,12 @@
     }
 
     public void map(boolean adapt) {
-        field.getValueInfo().assertNoSchemaComponents(field, !adapt);
+        OpenJPAConfiguration conf = field.getRepository().getConfiguration();
+        boolean isJoinColumnAllowedForToManyRelation = field.getRepository().
+            
getMetaDataFactory().getDefaults().isJoinColumnAllowedForToManyRelation(conf);
+        if (!isJoinColumnAllowedForToManyRelation) 
+            field.getValueInfo().assertNoSchemaComponents(field, !adapt);
+        
         field.getKeyMapping().getValueInfo().assertNoSchemaComponents
             (field.getKey(), !adapt);
 

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=815988&r1=815987&r2=815988&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
 Wed Sep 16 22:13:26 2009
@@ -63,6 +63,7 @@
     private boolean _autoOff = true;
     private boolean _superclassDiscriminatorStrategyByDefault = true;
     private boolean _isAbstractMappingUniDirectional = false;
+    private boolean _isJoinColumnAllowedForToManyRelation = false;
     
     /**
      * Whether to require exact identity value types when creating object
@@ -425,7 +426,7 @@
      * 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
+     * persistent relationships defined by a mapped superclass must be
      * unidirectional.
      * 
      * @param isAbstractMappingUniDirectional true if relationship defined in 
the 
@@ -441,14 +442,38 @@
      * 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.
+     * persistent relationships defined by a mapped superclass must be
+     * unidirectional. The default value is false.
      * 
      * @since 2.0.0
      */
     public boolean isAbstractMappingUniDirectional() {
         return _isAbstractMappingUniDirectional;
     }
+    
+    /**
+     * Whether OpenJPA allows JoinColumn annotation in conjunction with 
+     * OneToMany annotation.
+     * Prior to OpenJPA 2.0, the JoinColumn annotation is not allowed for 
+     * is OneToMany relation. JPA 2.0 spec relaxes this restriction.
+     * 
+     * @param isJoinColumnAllowedForToManyRelation true if JoinColumn is 
+     *        allowed for OneToMany relation
+     * @since 2.0.0
+     */
+    public void setJoinColumnAllowedForToManyRelation(boolean 
isJoinColumnAllowedForToManyRelation) {
+        _isJoinColumnAllowedForToManyRelation = 
isJoinColumnAllowedForToManyRelation;
+    }
 
+    /**
+     * Whether OpenJPA allows JoinColumn annotation in conjunction with 
+     * OneToMany annotation.
+     * Prior to OpenJPA 2.0, the JoinColumn annotation is not allowed for 
+     * is OneToMany relation. JPA 2.0 spec relaxes this restriction. The
+     * default value is false.
+     * @since 2.0.0
+     */
+    public boolean isJoinColumnAllowedForToManyRelation() {
+        return _isJoinColumnAllowedForToManyRelation;
+    }
 }
-

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=815988&r1=815987&r2=815988&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
 Wed Sep 16 22:13:26 2009
@@ -110,8 +110,15 @@
     /**
      * Whether the relationship in MappedSuper class must be
      * uni-directional.  
-     * @return 2.0.0
+     * @since 2.0.0
      */
     public boolean isAbstractMappingUniDirectional(OpenJPAConfiguration conf);
+    
+    /**
+     * Whether the JoinColumn annotation is allowed in conjunction with toMany
+     * relation.  
+     * @since 2.0.0
+     */
+    public boolean isJoinColumnAllowedForToManyRelation(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=815988&r1=815987&r2=815988&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
 Wed Sep 16 22:13:26 2009
@@ -160,6 +160,11 @@
     }
 
     public boolean isAbstractMappingUniDirectional(OpenJPAConfiguration conf) {
-        return true;
+        return false;
     }
+    
+    public boolean isJoinColumnAllowedForToManyRelation(OpenJPAConfiguration 
conf) {
+        return false;
+    }
+    
 }

Added: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/Bi_1ToM_FK.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/Bi_1ToM_FK.java?rev=815988&view=auto
==============================================================================
--- 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/Bi_1ToM_FK.java
 (added)
+++ 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/Bi_1ToM_FK.java
 Wed Sep 16 22:13:26 2009
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.openjpa.persistence.compat;
+
+import java.util.List;
+
+import javax.persistence.*;
+
+
+...@entity
+public class Bi_1ToM_FK {
+
+    @Id
+    @GeneratedValue
+    private long id;
+
+    private String name;
+
+    @OneToMany(mappedBy="bi1mfk")
+    @JoinColumn(name="Bi1MFK_ColA")
+    private List<EntityC> entityAs = null;
+    
+    public long getId() { 
+        return id; 
+    }
+
+    public String getName() { 
+        return name; 
+    }
+
+    public void setName(String name) { 
+        this.name = name; 
+    }
+
+    public List<EntityC> getEntityAs() { 
+        return entityAs; 
+    }
+
+    public void setEntityAs(List<EntityC> entityAs) { 
+        this.entityAs = entityAs; 
+    }
+}

Propchange: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/Bi_1ToM_FK.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/EntityC.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/EntityC.java?rev=815988&view=auto
==============================================================================
--- 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/EntityC.java
 (added)
+++ 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/EntityC.java
 Wed Sep 16 22:13:26 2009
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+package org.apache.openjpa.persistence.compat;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+...@entity
+...@table(name="JnCol_C")
+public class EntityC {
+
+    @Id
+    @GeneratedValue
+    private long id;
+
+    private String name;
+    
+    @ManyToOne
+    Bi_1ToM_FK bi1mfk;
+
+    public long getId() { 
+        return id; 
+    }
+
+    public String getName() { 
+        return name; 
+    }
+
+    public void setName(String name) { 
+        this.name = name; 
+    }
+
+    public void setBi1mfk(Bi_1ToM_FK bi1mfk) {
+        this.bi1mfk = bi1mfk;
+    }
+    
+    public Bi_1ToM_FK getBi1mfk() {
+        return bi1mfk;
+    }
+}

Propchange: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/EntityC.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/TestSpecCompatibilityOptions.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/TestSpecCompatibilityOptions.java?rev=815988&r1=815987&r2=815988&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/TestSpecCompatibilityOptions.java
 (original)
+++ 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/TestSpecCompatibilityOptions.java
 Wed Sep 16 22:13:26 2009
@@ -113,4 +113,25 @@
             emf.close();
         }
     }
+
+    /*
+     * Per JPA 2.0, JoinColumn annotation is allowed on OneToMany relations.
+     */
+    public void testJoinColumnOnToManyRelation() {
+        OpenJPAEntityManagerFactorySPI emf =
+            (OpenJPAEntityManagerFactorySPI)OpenJPAPersistence.
+                createEntityManagerFactory("persistence_2_0",
+                    "org/apache/openjpa/persistence/compat/" +
+                    "persistence_2_0.xml");
+        try {
+            EntityManager em = emf.createEntityManager();
+            // trigger table creation
+            em.getTransaction().begin();
+            em.getTransaction().commit();
+            em.close();
+            emf.close();
+        } catch (Exception e) {
+            fail("JoinColumn annotation fails to be with OneToMany relation");
+        }
+    }
 }

Modified: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/persistence/compat/persistence_2_0.xml
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/persistence/compat/persistence_2_0.xml?rev=815988&r1=815987&r2=815988&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/persistence/compat/persistence_2_0.xml
 (original)
+++ 
openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/persistence/compat/persistence_2_0.xml
 Wed Sep 16 22:13:26 2009
@@ -26,7 +26,9 @@
     <persistence-unit name="persistence_2_0" transaction-type="RESOURCE_LOCAL">
        <class>org.apache.openjpa.persistence.compat.EntityA</class>
        <class>org.apache.openjpa.persistence.compat.EntityB</class>
+       <class>org.apache.openjpa.persistence.compat.EntityC</class>
        <class>org.apache.openjpa.persistence.compat.MappedSuper</class>
+       <class>org.apache.openjpa.persistence.compat.Bi_1ToM_FK</class>
     
     </persistence-unit>
 </persistence>
\ No newline at end of file

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=815988&r1=815987&r2=815988&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
 Wed Sep 16 22:13:26 2009
@@ -132,6 +132,7 @@
     protected GetterFilter getterFilter = new GetterFilter();
     protected SetterFilter setterFilter = new SetterFilter();
     private Boolean _isAbstractMappingUniDirectional = null;
+    private Boolean _isJoinColumnAllowedForToManyRelation = null;
     
     public PersistenceMetaDataDefaults() {
         setCallbackMode(CALLBACK_RETHROW | CALLBACK_ROLLBACK |
@@ -872,4 +873,15 @@
     public void setAbstractMappingUniDirectional(OpenJPAConfiguration conf) {
         _isAbstractMappingUniDirectional = 
conf.getCompatibilityInstance().isAbstractMappingUniDirectional();
     }
+    
+    public boolean isJoinColumnAllowedForToManyRelation(OpenJPAConfiguration 
conf) {
+        if (_isJoinColumnAllowedForToManyRelation == null)
+            setJoinColumnAllowedForToManyRelation(conf);
+        return _isJoinColumnAllowedForToManyRelation;
+    }
+    
+    public void setJoinColumnAllowedForToManyRelation(OpenJPAConfiguration 
conf) {
+        _isJoinColumnAllowedForToManyRelation = 
conf.getCompatibilityInstance().
+            isJoinColumnAllowedForToManyRelation();
+    }
 }

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=815988&r1=815987&r2=815988&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
 Wed Sep 16 22:13:26 2009
@@ -186,6 +186,7 @@
             conf.validationMode.set(String.valueOf(ValidationMode.NONE));
         } else {
             compatibility.setAbstractMappingUniDirectional(true);
+            compatibility.setJoinColumnAllowedForToManyRelation(true);
         }
         return true;
     }


Reply via email to