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; }