Author: faywang
Date: Thu Oct 1 23:18:56 2009
New Revision: 820839
URL: http://svn.apache.org/viewvc?rev=820839&view=rev
Log:
OPENJPA-1330: support join table strategy for uni-directional many-to-one
relation and uni-/bi-directional one-to-one relation.
Added:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/Bi_1To1_JT.java
(with props)
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/EntityC_B11JT.java
(with props)
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/EntityC_U11JT.java
(with props)
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/Uni_1To1_JT.java
(with props)
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/Uni_MTo1_JT.java
(with props)
Modified:
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/FieldMapping.java
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/RelationFieldStrategy.java
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/TestSpecCompatibilityOptions.java
Modified:
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/FieldMapping.java
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/FieldMapping.java?rev=820839&r1=820838&r2=820839&view=diff
==============================================================================
---
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/FieldMapping.java
(original)
+++
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/FieldMapping.java
Thu Oct 1 23:18:56 2009
@@ -84,6 +84,10 @@
private Boolean _bi_MTo1_JT = null;
private Boolean _uni_1ToM_FK = null;
+ private Boolean _uni_MTo1_JT = null;
+ private Boolean _uni_1To1_JT = null;
+ private Boolean _bi_1To1_JT = null;
+
private FieldMapping _bi_1ToM_JT_Field = null;
private FieldMapping _bi_MTo1_JT_Field = null;
private ForeignKey _bi_1ToM_Join_FK = null;
@@ -1258,6 +1262,30 @@
return _bi_MTo1_JT;
}
+ public boolean isUni1ToMFK() {
+ if (_uni_1ToM_FK == null)
+ _uni_1ToM_FK = getMappingRepository().isUni1ToMFK(this);
+ return _uni_1ToM_FK;
+ }
+
+ public boolean isUniMTo1JT() {
+ if (_uni_MTo1_JT == null)
+ _uni_MTo1_JT = getMappingRepository().isUniMTo1JT(this);
+ return _uni_MTo1_JT;
+ }
+
+ public boolean isUni1To1JT() {
+ if (_uni_1To1_JT == null)
+ _uni_1To1_JT = getMappingRepository().isUni1To1JT(this);
+ return _uni_1To1_JT;
+ }
+
+ public boolean isBi1To1JT() {
+ if (_bi_1To1_JT == null)
+ _bi_1To1_JT = getMappingRepository().isBi1To1JT(this);
+ return _bi_1To1_JT;
+ }
+
public FieldMapping getBi_1ToM_JTField() {
if (_bi_1ToM_JT_Field == null) {
_bi_1ToM_JT_Field =
getMappingRepository().getBi_1ToM_JoinTableField(this);
@@ -1290,12 +1318,6 @@
return _bi_1ToM_Elem_FK;
}
- public boolean isUni1ToMFK() {
- if (_uni_1ToM_FK == null)
- _uni_1ToM_FK = getMappingRepository().isUni1ToMFK(this);
- return _uni_1ToM_FK;
- }
-
public void setBi1MJoinTableInfo() {
if (getAssociationType() == FieldMetaData.ONE_TO_MANY) {
FieldMapping mapped = getBi_MTo1_JTField();
@@ -1310,4 +1332,7 @@
}
}
+ public boolean isNonDefaultMappingUsingJoinTableStrategy() {
+ return isBi1To1JT() || isUni1To1JT() || isUniMTo1JT() || isBiMTo1JT();
+ }
}
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=820839&r1=820838&r2=820839&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
Thu Oct 1 23:18:56 2009
@@ -1016,19 +1016,46 @@
return
getMetaDataFactory().getDefaults().isNonDefaultMappingAllowed(conf);
}
+ public boolean isUniMTo1JT(FieldMapping field) {
+ if (isNonDefaultMappingAllowed() &&
+ field.getAssociationType() == FieldMetaData.MANY_TO_ONE &&
+ hasJoinTable(field) &&
+ !isBidirectional(field)) {
+
field.getValueMapping().getValueInfo().setColumns(field.getElementMapping().getValueInfo().getColumns());
+ return true;
+ }
+ return false;
+ }
+
+ public boolean isUni1To1JT(FieldMapping field) {
+ if (isNonDefaultMappingAllowed() &&
+ field.getAssociationType() == FieldMetaData.ONE_TO_ONE &&
+ hasJoinTable(field) &&
+ !isBidirectional(field)) {
+
field.getValueMapping().getValueInfo().setColumns(field.getElementMapping().getValueInfo().getColumns());
+ return true;
+ }
+ return false;
+ }
+
+ public boolean isBi1To1JT(FieldMapping field) {
+ if (isNonDefaultMappingAllowed() &&
+ field.getAssociationType() == FieldMetaData.ONE_TO_ONE &&
+ hasJoinTable(field) &&
+ isBidirectional(field)) {
+
field.getValueMapping().getValueInfo().setColumns(field.getElementMapping().getValueInfo().getColumns());
+ return true;
+ }
+ return false;
+ }
+
public boolean isUni1ToMFK(FieldMapping field) {
- FieldMapping mapped = field.getMappedByMapping();
- if (isNonDefaultMappingAllowed()) {
- if (field.getAssociationType() == FieldMetaData.ONE_TO_MANY ) {
- if (mapped == null) {
- if (hasJoinTable(field))
- return false;
- else if (hasJoinColumn(field)) {
-
field.getElementMapping().getValueInfo().setColumns(field.getValueInfo().getColumns());
- return true;
- }
- }
- }
+ if (isNonDefaultMappingAllowed() &&
+ field.getAssociationType() == FieldMetaData.ONE_TO_MANY &&
+ hasJoinColumn(field) &&
+ !isBidirectional(field)) {
+
field.getElementMapping().getValueInfo().setColumns(field.getValueInfo().getColumns());
+ return true;
}
return false;
}
@@ -1076,12 +1103,8 @@
if (field.getAssociationType() == FieldMetaData.MANY_TO_ONE) {
if (!hasJoinTable(field))
return null;
- ClassMapping inverse =
field.getValueMapping().getTypeMapping();
- FieldMapping[] fmds = inverse.getFieldMappings();
- for (int i = 0; i < fmds.length; i++) {
- if (field == fmds[i].getMappedByMapping())
- return field;
- }
+ if (isBidirectional(field))
+ return field;
} else if (field.getAssociationType() ==
FieldMetaData.ONE_TO_MANY) {
FieldMapping mappedBy = field.getMappedByMapping();
if (mappedBy != null && hasJoinTable(mappedBy))
@@ -1100,6 +1123,21 @@
boolean hasJoinTable = field.getMappingInfo().getTableName() != null ?
true : false;
return hasJoinTable;
}
+
+ public boolean isBidirectional(FieldMapping field) {
+ if (field.getMappedByMapping() != null) return true;
+ int assoType = field.getAssociationType();
+ if (assoType == FieldMetaData.ONE_TO_ONE ||
+ assoType == FieldMetaData.MANY_TO_ONE) {
+ ClassMapping inverse = field.getValueMapping().getTypeMapping();
+ FieldMapping[] fmds = inverse.getFieldMappings();
+ for (int i = 0; i < fmds.length; i++) {
+ if (field == fmds[i].getMappedByMapping())
+ return true;
+ }
+ }
+ return false;
+ }
/**
* Check the given value against mapped strategies.
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=820839&r1=820838&r2=820839&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
Thu Oct 1 23:18:56 2009
@@ -88,7 +88,7 @@
field.getKeyMapping().getValueInfo().assertNoSchemaComponents
(field.getKey(), !adapt);
- if (!field.isBiMTo1JT())
+ if (!field.isNonDefaultMappingUsingJoinTableStrategy())
field.getElementMapping().getValueInfo().assertNoSchemaComponents
(field.getElement(), !adapt);
boolean criteria = field.getValueInfo().getUseClassCriteria();
Added:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/Bi_1To1_JT.java
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/Bi_1To1_JT.java?rev=820839&view=auto
==============================================================================
---
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/Bi_1To1_JT.java
(added)
+++
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/Bi_1To1_JT.java
Thu Oct 1 23:18:56 2009
@@ -0,0 +1,76 @@
+/*
+ * 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
+public class Bi_1To1_JT {
+
+ @Id
+ @GeneratedValue
+ private long id;
+
+ private String name;
+
+ // A JoinTable annotation is specified on the owning side of the
association
+ @OneToOne
+ @JoinTable(
+ name="Bi11JT_C",
+ joinColumns=
+ @JoinColumn(name="B_ID", referencedColumnName="ID"),
+ inverseJoinColumns=
+ @JoinColumn(name="C_ID", referencedColumnName="ID")
+ )
+ private EntityC_B11JT entityC;
+
+ public long getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public EntityC_B11JT getEntityC() {
+ return entityC;
+ }
+
+ public void setEntityC(EntityC_B11JT entityC) {
+ this.entityC = entityC;
+ }
+
+ public int hashCode() {
+ return name.hashCode() + (int)id;
+ }
+
+ public boolean equals(Object o) {
+ if (!(o instanceof Bi_1To1_JT)) return false;
+ Bi_1To1_JT b = (Bi_1To1_JT)o;
+ if (!b.name.equals(name)) return false;
+ if (b.id != id) return false;
+ if (b.entityC == null && entityC == null) return true;
+ if (b.entityC.getId() != entityC.getId()) return false;
+ return true;
+ }
+}
Propchange:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/Bi_1To1_JT.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/EntityC_B11JT.java
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/EntityC_B11JT.java?rev=820839&view=auto
==============================================================================
---
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/EntityC_B11JT.java
(added)
+++
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/EntityC_B11JT.java
Thu Oct 1 23:18:56 2009
@@ -0,0 +1,68 @@
+/*
+ * 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
+public class EntityC_B11JT {
+
+ @Id
+ @GeneratedValue
+ private long id;
+
+ private String name;
+
+ @OneToOne(mappedBy="entityC")
+ private Bi_1To1_JT bi11jt;
+
+ public long getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public void setBi11jt(Bi_1To1_JT bi11jt) {
+ this.bi11jt = bi11jt;
+ }
+
+ public Bi_1To1_JT getBi11jt() {
+ return bi11jt;
+ }
+
+ public int hashCode() {
+ return name.hashCode() + (int)id;
+ }
+
+ public boolean equals(Object o) {
+ if (!(o instanceof EntityC_B11JT)) return false;
+ EntityC_B11JT c = (EntityC_B11JT)o;
+ if (!c.name.equals(name)) return false;
+ if (c.id != id) return false;
+ if (c.bi11jt == null && bi11jt == null) return true;
+ if (!c.bi11jt.equals(bi11jt)) return false;
+ return true;
+ }
+}
Propchange:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/EntityC_B11JT.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/EntityC_U11JT.java
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/EntityC_U11JT.java?rev=820839&view=auto
==============================================================================
---
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/EntityC_U11JT.java
(added)
+++
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/EntityC_U11JT.java
Thu Oct 1 23:18:56 2009
@@ -0,0 +1,56 @@
+/*
+ * 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
+public class EntityC_U11JT {
+
+ @Id
+ @GeneratedValue
+ private long id;
+
+ private String name;
+
+ public long getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int hashCode() {
+ return name.hashCode() + (int)id;
+ }
+
+ public boolean equals(Object o) {
+ if (!(o instanceof EntityC_U11JT)) return false;
+ EntityC_U11JT c = (EntityC_U11JT)o;
+ if (!c.name.equals(name)) return false;
+ if (c.id != id) return false;
+ return true;
+ }
+}
Propchange:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/EntityC_U11JT.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=820839&r1=820838&r2=820839&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
Thu Oct 1 23:18:56 2009
@@ -201,7 +201,7 @@
public void crudUni1MFK(EntityManager em) {
//create
Uni_1ToM_FK u = new Uni_1ToM_FK();
- u.setName("uni1mfk");
+ u.setName("u");
List<EntityC_U1MFK> cs = new ArrayList<EntityC_U1MFK>();
EntityC_U1MFK c = new EntityC_U1MFK();
c.setName("c");
@@ -227,7 +227,7 @@
EntityC_U1MFK c2 = cs.remove(0);
Uni_1ToM_FK u2 = new Uni_1ToM_FK();
- u2.setName("uni1mfk2");
+ u2.setName("u2");
List<EntityC_U1MFK> cs2 = new ArrayList<EntityC_U1MFK>();
cs2.add(c2);
u2.setEntityCs(cs2);
@@ -256,7 +256,7 @@
// default
public void crudUni1MJT(EntityManager em) {
Uni_1ToM_JT u = new Uni_1ToM_JT();
- u.setName("uni1mjt");
+ u.setName("u");
List<EntityC> cs = new ArrayList<EntityC>();
EntityC c = new EntityC();
c.setName("c");
@@ -299,7 +299,7 @@
//default
public void crudBi1MFK(EntityManager em) {
Bi_1ToM_FK b = new Bi_1ToM_FK();
- b.setName("bi1mfk");
+ b.setName("b");
List<EntityC_B1MFK> cs = new ArrayList<EntityC_B1MFK>();
EntityC_B1MFK c = new EntityC_B1MFK();
c.setName("c");
@@ -324,7 +324,7 @@
em.clear();
//query
- Query q = em.createQuery("SELECT u FROM Bi_1ToM_FK u");
+ Query q = em.createQuery("SELECT b FROM Bi_1ToM_FK b");
Bi_1ToM_FK b1 = (Bi_1ToM_FK)q.getSingleResult();
assertEquals(b, b1);
em.clear();
@@ -343,7 +343,7 @@
public void crudBi1MJT(EntityManager em) {
Bi_1ToM_JT b = new Bi_1ToM_JT();
- b.setName("bi1mfk");
+ b.setName("b");
List<EntityC_B1MJT> cs = new ArrayList<EntityC_B1MJT>();
EntityC_B1MJT c = new EntityC_B1MJT();
c.setName("c");
@@ -429,7 +429,7 @@
public void crudUni1MMapFK(EntityManager em) {
//create
Uni_1ToM_Map_FK u = new Uni_1ToM_Map_FK();
- u.setName("uni1mfk");
+ u.setName("u");
Map<String, EntityC_U1M_Map_FK> cs = new HashMap<String,
EntityC_U1M_Map_FK>();
EntityC_U1M_Map_FK c1 = new EntityC_U1M_Map_FK();
c1.setName("c1");
@@ -447,7 +447,7 @@
//update by adding a new C
cs = u.getEntityCs();
- u.setName("uni1mfk_new");
+ u.setName("newName");
EntityC_U1M_Map_FK c3 = new EntityC_U1M_Map_FK();
c3.setName("c3");
cs.put(c3.getName(), c3);
@@ -461,7 +461,7 @@
EntityC_U1M_Map_FK c4 = cs.remove("c1");
Uni_1ToM_Map_FK u2 = new Uni_1ToM_Map_FK();
- u2.setName("uni1mfk2");
+ u2.setName("u2");
Map<String, EntityC_U1M_Map_FK> cs2 = new HashMap<String,
EntityC_U1M_Map_FK>();
cs2.put(c4.getName(), c4);
u2.setEntityCs(cs2);
@@ -470,7 +470,7 @@
em.clear();
//query
- Query q = em.createQuery("SELECT u FROM Uni_1ToM_Map_FK u where
u.name='uni1mfk_new'");
+ Query q = em.createQuery("SELECT u FROM Uni_1ToM_Map_FK u where
u.name='newName'");
Uni_1ToM_Map_FK u1 = (Uni_1ToM_Map_FK)q.getSingleResult();
assertEquals(u, u1);
em.clear();
@@ -488,7 +488,7 @@
public void crudBi1MMapJT(EntityManager em) {
Bi_1ToM_Map_JT b = new Bi_1ToM_Map_JT();
- b.setName("bi1mfk");
+ b.setName("b");
Map<String, EntityC_B1M_Map_JT> cs = new HashMap<String,
EntityC_B1M_Map_JT>();
EntityC_B1M_Map_JT c = new EntityC_B1M_Map_JT();
c.setName("c");
@@ -513,7 +513,7 @@
em.clear();
//query
- Query q = em.createQuery("SELECT u FROM Bi_1ToM_Map_JT u");
+ Query q = em.createQuery("SELECT b FROM Bi_1ToM_Map_JT b");
Bi_1ToM_Map_JT b1 = (Bi_1ToM_Map_JT)q.getSingleResult();
assertEquals(b, b1);
em.clear();
@@ -521,7 +521,7 @@
// query the owner
q = em.createQuery("SELECT c FROM EntityC_B1M_Map_JT c");
List<EntityC_B1M_Map_JT> cs1 = q.getResultList();
- System.err.println("cs1 size = " + cs1.size());
+ assertEquals(2, cs.size());
em.clear();
//find
@@ -538,7 +538,7 @@
public void crudUni1MMapRelKeyFK(EntityManager em) {
//create
Uni_1ToM_Map_RelKey_FK u = new Uni_1ToM_Map_RelKey_FK();
- u.setName("uni1mfk");
+ u.setName("u");
Map<EntityC, EntityC_U1M_Map_RelKey_FK> cs = new HashMap<EntityC,
EntityC_U1M_Map_RelKey_FK>();
EntityC_U1M_Map_RelKey_FK c1 = new EntityC_U1M_Map_RelKey_FK();
c1.setName("c1");
@@ -563,7 +563,7 @@
//update by adding a new C
em.getTransaction().begin();
cs = u.getEntityCs();
- u.setName("uni1mfk_new");
+ u.setName("newName");
EntityC_U1M_Map_RelKey_FK c3 = new EntityC_U1M_Map_RelKey_FK();
c3.setName("c3");
EntityC cKey3 = new EntityC();
@@ -578,7 +578,7 @@
EntityC_U1M_Map_RelKey_FK c4 = cs.remove(cKey1);
Uni_1ToM_Map_RelKey_FK u2 = new Uni_1ToM_Map_RelKey_FK();
- u2.setName("uni1mfk2");
+ u2.setName("u2");
Map<EntityC, EntityC_U1M_Map_RelKey_FK> cs2 = new HashMap<EntityC,
EntityC_U1M_Map_RelKey_FK>();
cs2.put(cKey1, c4);
u2.setEntityCs(cs2);
@@ -587,7 +587,7 @@
em.clear();
//query
- Query q = em.createQuery("SELECT u FROM Uni_1ToM_Map_RelKey_FK u where
u.name='uni1mfk_new'");
+ Query q = em.createQuery("SELECT u FROM Uni_1ToM_Map_RelKey_FK u where
u.name='newName'");
Uni_1ToM_Map_RelKey_FK u1 =
(Uni_1ToM_Map_RelKey_FK)q.getSingleResult();
assertEquals(u, u1);
em.clear();
@@ -605,7 +605,7 @@
public void crudBi1MMapRelKeyJT(EntityManager em) {
Bi_1ToM_Map_RelKey_JT b = new Bi_1ToM_Map_RelKey_JT();
- b.setName("bi1mfk");
+ b.setName("b");
Map<EntityC, EntityC_B1M_Map_RelKey_JT> cs = new HashMap<EntityC,
EntityC_B1M_Map_RelKey_JT>();
EntityC_B1M_Map_RelKey_JT c = new EntityC_B1M_Map_RelKey_JT();
c.setName("c");
@@ -636,7 +636,7 @@
em.clear();
//query
- Query q = em.createQuery("SELECT u FROM Bi_1ToM_Map_RelKey_JT u");
+ Query q = em.createQuery("SELECT b FROM Bi_1ToM_Map_RelKey_JT b");
Bi_1ToM_Map_RelKey_JT b1 = (Bi_1ToM_Map_RelKey_JT)q.getSingleResult();
assertEquals(b, b1);
em.clear();
@@ -658,6 +658,201 @@
em.getTransaction().commit();
}
+ public void testUniManyToOneUsingJoinTable() {
+ List<Class<?>> types = new ArrayList<Class<?>>();
+ types.add(EntityC.class);
+ types.add(Uni_MTo1_JT.class);
+ OpenJPAEntityManagerFactorySPI emf = createEMF2_0(types);
+ EntityManager em = emf.createEntityManager();
+
+ try {
+ // trigger table creation
+ em.getTransaction().begin();
+ em.getTransaction().commit();
+ assertSQLFragnments(sql, "CREATE TABLE UniM1JT_C", "U_ID", "C_ID");
+ crudUniM1JT(em);
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail("ManyToOne mapping failed with exception message: " +
e.getMessage());
+ } finally {
+ em.close();
+ emf.close();
+ }
+ }
+
+ public void crudUniM1JT(EntityManager em) {
+ //create
+ Uni_MTo1_JT u = new Uni_MTo1_JT();
+ u.setName("u");
+
+ Uni_MTo1_JT u1 = new Uni_MTo1_JT();
+ u1.setName("u1");
+
+ EntityC c1 = new EntityC();
+ c1.setName("c1");
+ u.setEntityC(c1);
+ u1.setEntityC(c1);
+
+ em.persist(u);
+ em.persist(u1);
+ em.persist(c1);
+ em.getTransaction().begin();
+ em.getTransaction().commit();
+
+ //update by changing the many-to-one value
+ em.getTransaction().begin();
+ u.setName("u_new");
+ EntityC c3 = new EntityC();
+ c3.setName("c3");
+ u.setEntityC(c3);
+ em.persist(c3);
+ em.getTransaction().commit();
+
+ // update be removing the many-to-one value
+ em.getTransaction().begin();
+ u.setEntityC(null);
+ em.getTransaction().commit();
+
+ //query
+ Query q = em.createQuery("SELECT u FROM Uni_MTo1_JT u where
u.name='u_new'");
+ Uni_MTo1_JT queryU = (Uni_MTo1_JT)q.getSingleResult();
+ assertEquals(u, queryU);
+ em.clear();
+
+ //find
+ long id = u1.getId();
+ Uni_MTo1_JT findU = em.find(Uni_MTo1_JT.class, id);
+ assertEquals(u1, findU);
+
+ //remove
+ em.getTransaction().begin();
+ em.remove(findU);
+ em.getTransaction().commit();
+ }
+
+ public void testOneToOneUsingJoinTable() {
+ List<Class<?>> types = new ArrayList<Class<?>>();
+ types.add(EntityC_B11JT.class);
+ types.add(EntityC_U11JT.class);
+ types.add(Bi_1To1_JT.class);
+ types.add(Uni_1To1_JT.class);
+ OpenJPAEntityManagerFactorySPI emf = createEMF2_0(types);
+ EntityManager em = emf.createEntityManager();
+
+ try {
+ // trigger table creation
+ em.getTransaction().begin();
+ em.getTransaction().commit();
+ assertSQLFragnments(sql, "CREATE TABLE Bi11JT_C", "B_ID", "C_ID");
+ assertSQLFragnments(sql, "CREATE TABLE Uni11JT_C", "U_ID", "C_ID");
+ crudBi11JT(em);
+ crudUni11JT(em);
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail("OneToOne mapping failed with exception message: " +
e.getMessage());
+ } finally {
+ em.close();
+ emf.close();
+ }
+ }
+
+ public void crudUni11JT(EntityManager em) {
+ Uni_1To1_JT u = new Uni_1To1_JT();
+ u.setName("uni1mjt");
+
+ EntityC_U11JT c1 = new EntityC_U11JT();
+ c1.setName("c1");
+ u.setEntityC(c1);
+
+ em.persist(u);
+ em.persist(c1);
+ em.getTransaction().begin();
+ em.getTransaction().commit();
+
+ //update by setting to a new C
+ em.getTransaction().begin();
+ u.setName("uni1mjt_new");
+ EntityC_U11JT newC = new EntityC_U11JT();
+ newC.setName("newC");
+ u.setEntityC(newC);
+ em.persist(newC);
+ em.getTransaction().commit();
+
+ // update by setting to null
+ em.getTransaction().begin();
+ u.setEntityC(null);
+ em.getTransaction().commit();
+ em.clear();
+
+ //query
+ Query q = em.createQuery("SELECT u FROM Uni_1To1_JT u where u.name =
'uni1mjt_new'");
+ Uni_1To1_JT u1 = (Uni_1To1_JT)q.getSingleResult();
+ assertEquals(u, u1);
+ em.clear();
+
+ //find
+ long id = u1.getId();
+ Uni_1To1_JT findU1 = em.find(Uni_1To1_JT.class, id);
+ assertEquals(u, findU1);
+
+ //remove
+ em.getTransaction().begin();
+ em.remove(findU1);
+ em.getTransaction().commit();
+ }
+
+ public void crudBi11JT(EntityManager em) {
+ Bi_1To1_JT b = new Bi_1To1_JT();
+ b.setName("bi11fk");
+
+ EntityC_B11JT c = new EntityC_B11JT();
+ c.setName("c");
+ b.setEntityC(c);
+ //c.setBi11jt(b);
+
+ em.persist(b);
+ em.persist(c);
+ em.getTransaction().begin();
+ em.getTransaction().commit();
+
+ // update by removing a c
+ em.getTransaction().begin();
+ b.setEntityC(null);
+ em.getTransaction().commit();
+
+ //update
+ em.getTransaction().begin();
+ b.setName("newName");
+ EntityC_B11JT c1 = new EntityC_B11JT();
+ c1.setName("c1");
+ b.setEntityC(c1);
+ //c1.setBi11jt(b);
+ em.persist(c1);
+ em.getTransaction().commit();
+
+ //query
+ Query q = em.createQuery("SELECT u FROM Bi_1To1_JT u");
+ Bi_1To1_JT b1 = (Bi_1To1_JT)q.getSingleResult();
+ assertEquals(b, b1);
+ em.clear();
+
+ // query
+ q = em.createQuery("SELECT c FROM EntityC_B11JT c");
+ List<EntityC_B11JT> cs1 = q.getResultList();
+ assertEquals(2, cs1.size());
+ em.clear();
+
+ //find
+ long id = b1.getId();
+ Bi_1To1_JT b2 = em.find(Bi_1To1_JT.class, id);
+ assertEquals(b, b2);
+
+ //remove
+ em.getTransaction().begin();
+ em.remove(b2);
+ em.getTransaction().commit();
+ }
+
private OpenJPAEntityManagerFactorySPI createEMF2_0(List<Class<?>> types) {
Map<Object,Object> map = new HashMap<Object,Object>();
map.put("openjpa.jdbc.JDBCListeners",
Added:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/Uni_1To1_JT.java
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/Uni_1To1_JT.java?rev=820839&view=auto
==============================================================================
---
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/Uni_1To1_JT.java
(added)
+++
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/Uni_1To1_JT.java
Thu Oct 1 23:18:56 2009
@@ -0,0 +1,75 @@
+/*
+ * 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
+public class Uni_1To1_JT {
+
+ @Id
+ @GeneratedValue
+ private long id;
+
+ private String name;
+
+ @OneToOne
+ @JoinTable(
+ name="Uni11JT_C",
+ joinColumns=
+ @JoinColumn(name="U_ID", referencedColumnName="ID"),
+ inverseJoinColumns=
+ @JoinColumn(name="C_ID", referencedColumnName="ID")
+ )
+ private EntityC_U11JT entityC;
+
+ public long getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public EntityC_U11JT getEntityC() {
+ return entityC;
+ }
+
+ public void setEntityC(EntityC_U11JT entityC) {
+ this.entityC = entityC;
+ }
+
+ public int hashCode() {
+ return name.hashCode() + (int)id;
+ }
+
+ public boolean equals(Object o) {
+ if (!(o instanceof Uni_1To1_JT)) return false;
+ Uni_1To1_JT u = (Uni_1To1_JT)o;
+ if (!u.name.equals(name)) return false;
+ if (u.id != id) return false;
+ if (u.entityC == null && entityC == null) return true;
+ if (u.entityC.getId() != entityC.getId()) return false;
+ return true;
+ }
+}
Propchange:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/Uni_1To1_JT.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/Uni_MTo1_JT.java
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/Uni_MTo1_JT.java?rev=820839&view=auto
==============================================================================
---
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/Uni_MTo1_JT.java
(added)
+++
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/Uni_MTo1_JT.java
Thu Oct 1 23:18:56 2009
@@ -0,0 +1,75 @@
+/*
+ * 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
+public class Uni_MTo1_JT {
+
+ @Id
+ @GeneratedValue
+ private long id;
+
+ private String name;
+
+ @ManyToOne
+ @JoinTable(
+ name="UniM1JT_C",
+ joinColumns=
+ @JoinColumn(name="U_ID", referencedColumnName="ID"),
+ inverseJoinColumns=
+ @JoinColumn(name="C_ID", referencedColumnName="ID")
+ )
+ private EntityC entityC;
+
+ public long getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public EntityC getEntityC() {
+ return entityC;
+ }
+
+ public void setEntityC(EntityC entityC) {
+ this.entityC = entityC;
+ }
+
+ public int hashCode() {
+ return name.hashCode() + (int)id;
+ }
+
+ public boolean equals(Object o) {
+ if (!(o instanceof Uni_MTo1_JT)) return false;
+ Uni_MTo1_JT c = (Uni_MTo1_JT)o;
+ if (!c.name.equals(name)) return false;
+ if (c.id != id) return false;
+ if (c.entityC == null && entityC == null) return true;
+ if (!c.entityC.equals(entityC)) return false;
+ return true;
+ }
+}
Propchange:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/compat/Uni_MTo1_JT.java
------------------------------------------------------------------------------
svn:eol-style = native