blob: f5e7a5433739bb4916a8e6e6821c4db82de1c654 [file] [log] [blame]
/*
* 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.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import org.apache.openjpa.conf.Compatibility;
import org.apache.openjpa.conf.Specification;
import org.apache.openjpa.lib.jdbc.AbstractJDBCListener;
import org.apache.openjpa.lib.jdbc.JDBCEvent;
import org.apache.openjpa.lib.jdbc.JDBCListener;
import org.apache.openjpa.persistence.OpenJPAEntityManagerFactorySPI;
import org.apache.openjpa.persistence.jdbc.SQLSniffer;
import org.apache.openjpa.persistence.test.ContainerEMFTest;
// Tests same functionality as TestSpecCompatibilityOptions, except that
// this variation runs through the path a JEE container uses to create
// an EMF.
public class TestContainerSpecCompatibilityOptions
extends ContainerEMFTest {
protected List<String> sql = new ArrayList<>();
protected int sqlCount;
@Override
public String getPersistenceResourceName() {
return "org/apache/openjpa/persistence/compat/persistence_2_0.xml";
}
@Override
public String getPersistenceUnitName() {
return "persistence_2_0";
}
/*
* Verifies compatibility options and spec level are appropriate
* for a version 2 persistence.xml
*/
public void testJPA1CompatibilityOptions() {
OpenJPAEntityManagerFactorySPI emf1 =
(OpenJPAEntityManagerFactorySPI)
createContainerEMF("persistence_1_0",
"org/apache/openjpa/persistence/compat/" +
"persistence_1_0.xml", null);
Compatibility compat = emf1.getConfiguration().getCompatibilityInstance();
assertTrue(compat.getFlushBeforeDetach());
assertTrue(compat.getCopyOnDetach());
assertTrue(compat.getIgnoreDetachedStateFieldForProxySerialization());
assertTrue(compat.getPrivatePersistentProperties());
assertFalse(compat.isAbstractMappingUniDirectional());
assertFalse(compat.isNonDefaultMappingAllowed());
String vMode = emf1.getConfiguration().getValidationMode();
assertEquals("NONE", vMode);
Specification spec = emf1.getConfiguration().getSpecificationInstance();
assertEquals("JPA", spec.getName().toUpperCase());
assertEquals(spec.getVersion(), 1);
closeEMF(emf1);
}
/*
* Verifies compatibility options and spec level are appropriate
* for a version 2 persistence.xml
*/
public void testJPA2CompatibilityOptions() {
Compatibility compat = emf.getConfiguration().getCompatibilityInstance();
assertFalse(compat.getFlushBeforeDetach());
assertFalse(compat.getCopyOnDetach());
assertFalse(compat.getIgnoreDetachedStateFieldForProxySerialization());
assertFalse(compat.getPrivatePersistentProperties());
assertTrue(compat.isAbstractMappingUniDirectional());
assertTrue(compat.isNonDefaultMappingAllowed());
String vMode = emf.getConfiguration().getValidationMode();
assertEquals("AUTO", vMode);
Specification spec = emf.getConfiguration().getSpecificationInstance();
assertEquals("JPA", spec.getName().toUpperCase());
assertEquals(spec.getVersion(), 2);
}
/*
* Per JPA 2.0, Relationships in mapped superclass must be unidirectional.
* An exceptioin will be thrown when a bi-directional relation is detected in
* a mapped superclass.
*/
public void testMappedSuperClass() {
List<Class<?>> types = new ArrayList<>();
types.add(EntityA.class);
types.add(EntityB.class);
types.add(MappedSuper.class);
OpenJPAEntityManagerFactorySPI oemf = createEMF2_0(types);
EntityManager em = null;
try {
em = oemf.createEntityManager();
EntityA a = new EntityA();
a.setId(1);
EntityB b = new EntityB();
b.setId(1);
a.setEntityB(b);
b.setEntityA(a);
em.getTransaction().begin();
em.persist(a);
em.persist(b);
em.getTransaction().commit();
em.close();
fail("An exceptioin will be thrown for a bi-directional relation declared in mapped superclass");
} catch (org.apache.openjpa.persistence.ArgumentException e) {
if (em != null) {
em.getTransaction().rollback();
em.close();
}
} finally {
closeEMF(oemf);
}
}
/**
* Per JPA 2.0, the following one-to-many mappings are supported.
* (1) uni-/OneToMany/foreign key strategy
* (2) uni-/OneToMany/join table strategy (default)
* (3) bi-/OneToMany/foreign key strategy (default)
* (4) bi-/OneToMany/join table strategy
* The JoinColumn and JoinTable annotations or corresponding XML
* elements must be used to specify such non-default mappings
*
* For (1), the spec provides the following example (Sec 11.1.36):
* Example 3: Unidirectional One-to-Many association using a foreign
* key mapping:
* In Customer class:
* @OneToMany(orphanRemoval=true)
* @JoinColumn(name="CUST_ID") // join column is in table for Order
* public Set<Order> getOrders() {return orders;}
*
* For (4), Bi-directional One-t-Many association using the join
* table mapping:
* In Customer class:
* @OneToMany(mappedBy="customer")
* @JoinTable(
* name="Customer_Orders",
* joinColumns=
* @JoinColumn(name="Order_ID", referencedColumnName="ID"),
* inverseJoinColumns=
* @JoinColumn(name="Cust_ID", referencedColumnName="ID")
* )
* public Set<Order> getOrders() {return orders;}
*
* Note that in this scenario, @JoinTable is required. Simply applying @JoinColumn
* without @JoinTable will result in an exception thrown by openjpa.
*
*/
public void testOneToManyRelation() {
List<Class<?>> types = new ArrayList<>();
types.add(EntityC.class);
types.add(EntityC_B1MFK.class);
types.add(EntityC_B1MJT.class);
types.add(EntityC_U1MFK.class);
types.add(Bi_1ToM_FK.class);
types.add(Bi_1ToM_JT.class);
types.add(Uni_1ToM_FK.class);
types.add(Uni_1ToM_JT.class);
OpenJPAEntityManagerFactorySPI oemf = createEMF2_0(types);
EntityManager em = oemf.createEntityManager();
try {
// trigger table creation
em.getTransaction().begin();
em.getTransaction().commit();
assertSQLFragnments(sql, "CREATE TABLE Bi1MJT_C", "C_ID", "Bi1MJT_ID");
assertSQLFragnments(sql, "CREATE TABLE C_B1MFK", "BI1MFK_ID");
assertSQLFragnments(sql, "CREATE TABLE Uni1MJT_C", "Uni1MJT_ID", "C_ID");
assertSQLFragnments(sql, "CREATE TABLE C_B1MFK", "BI1MFK_ID");
assertSQLFragnments(sql, "CREATE TABLE C_U1MFK", "Uni1MFK_ID");
crudUni1MFK(em);
crudUni1MJT(em);
crudBi1MFK(em);
crudBi1MJT(em);
} catch (Exception e) {
e.printStackTrace();
fail("OneToMany mapping failed with exception message: " + e.getMessage());
} finally {
em.close();
closeEMF(oemf);
}
}
// non default
public void crudUni1MFK(EntityManager em) {
//create
Uni_1ToM_FK u = new Uni_1ToM_FK();
u.setName("u");
List<EntityC_U1MFK> cs = new ArrayList<>();
EntityC_U1MFK c = new EntityC_U1MFK();
c.setName("c");
cs.add(c);
u.setEntityCs(cs);
em.persist(u);
em.persist(c);
em.getTransaction().begin();
em.getTransaction().commit();
//update
em.getTransaction().begin();
cs = u.getEntityCs();
u.setName("newName");
EntityC_U1MFK c1 = new EntityC_U1MFK();
c1.setName("c1");
cs.add(c1);
em.persist(c1);
em.getTransaction().commit();
// update by removing a c and then add this c to a new u
em.getTransaction().begin();
EntityC_U1MFK c2 = cs.remove(0);
Uni_1ToM_FK u2 = new Uni_1ToM_FK();
u2.setName("u2");
List<EntityC_U1MFK> cs2 = new ArrayList<>();
cs2.add(c2);
u2.setEntityCs(cs2);
em.persist(u2);
em.getTransaction().commit();
em.clear();
//query
Query q = em.createQuery("SELECT u FROM Uni_1ToM_FK u where u.name = 'newName'");
Uni_1ToM_FK u1 = (Uni_1ToM_FK)q.getSingleResult();
assertEquals(u, u1);
em.clear();
//find
long id = u1.getId();
Uni_1ToM_FK findU1 = em.find(Uni_1ToM_FK.class, id);
assertEquals(findU1, u1);
//remove
em.getTransaction().begin();
em.remove(findU1);
em.getTransaction().commit();
em.clear();
}
// default
public void crudUni1MJT(EntityManager em) {
Uni_1ToM_JT u = new Uni_1ToM_JT();
u.setName("u");
List<EntityC> cs = new ArrayList<>();
EntityC c = new EntityC();
c.setName("c");
cs.add(c);
u.setEntityCs(cs);
em.persist(u);
em.persist(c);
em.getTransaction().begin();
em.getTransaction().commit();
//update
em.getTransaction().begin();
cs = u.getEntityCs();
u.setName("newName");
EntityC c1 = new EntityC();
c1.setName("c1");
cs.add(c1);
em.persist(c1);
em.getTransaction().commit();
em.clear();
//query
Query q = em.createQuery("SELECT u FROM Uni_1ToM_JT u");
Uni_1ToM_JT u1 = (Uni_1ToM_JT)q.getSingleResult();
assertEquals(u, u1);
em.clear();
//find
long id = u1.getId();
Uni_1ToM_JT u2 = em.find(Uni_1ToM_JT.class, id);
assertEquals(u, u2);
//remove
em.getTransaction().begin();
em.remove(u2);
em.getTransaction().commit();
em.clear();
}
//default
public void crudBi1MFK(EntityManager em) {
Bi_1ToM_FK b = new Bi_1ToM_FK();
b.setName("b");
List<EntityC_B1MFK> cs = new ArrayList<>();
EntityC_B1MFK c = new EntityC_B1MFK();
c.setName("c");
c.setBi1mfk(b);
cs.add(c);
b.setEntityCs(cs);
em.persist(b);
em.persist(c);
em.getTransaction().begin();
em.getTransaction().commit();
//update
em.getTransaction().begin();
cs = b.getEntityCs();
b.setName("newName");
EntityC_B1MFK c1 = new EntityC_B1MFK();
c1.setName("c1");
cs.add(c1);
c1.setBi1mfk(b);
em.persist(c1);
em.getTransaction().commit();
em.clear();
//query
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();
//find
long id = b1.getId();
Bi_1ToM_FK b2 = em.find(Bi_1ToM_FK.class, id);
assertEquals(b, b2);
//remove
em.getTransaction().begin();
em.remove(b2);
em.getTransaction().commit();
em.clear();
}
public void crudBi1MJT(EntityManager em) {
Bi_1ToM_JT b = new Bi_1ToM_JT();
b.setName("b");
List<EntityC_B1MJT> cs = new ArrayList<>();
EntityC_B1MJT c = new EntityC_B1MJT();
c.setName("c");
c.setBi1mjt(b);
cs.add(c);
b.setEntityCs(cs);
em.persist(b);
em.persist(c);
em.getTransaction().begin();
em.getTransaction().commit();
//update
em.getTransaction().begin();
cs = b.getEntityCs();
b.setName("newName");
EntityC_B1MJT c1 = new EntityC_B1MJT();
c1.setName("c1");
cs.add(c1);
c1.setBi1mjt(b);
em.persist(c1);
em.getTransaction().commit();
em.clear();
//query
Query q = em.createQuery("SELECT b FROM Bi_1ToM_JT b where b.name = 'newName'");
Bi_1ToM_JT b1 = (Bi_1ToM_JT)q.getSingleResult();
assertEquals(b, b1);
em.clear();
//query
q = em.createQuery("SELECT c FROM EntityC_B1MJT c");
List<EntityC_B1MJT> cs1 = q.getResultList();
assertEquals(2, cs1.size());
em.clear();
//find
long id = b1.getId();
Bi_1ToM_JT b2 = em.find(Bi_1ToM_JT.class, id);
assertEquals(b, b2);
//remove
em.getTransaction().begin();
em.remove(b2);
em.getTransaction().commit();
em.clear();
}
public void testOneToManyMapRelation() {
List<Class<?>> types = new ArrayList<>();
types.add(EntityC_U1M_Map_FK.class);
types.add(Uni_1ToM_Map_FK.class);
types.add(EntityC_B1M_Map_JT.class);
types.add(Bi_1ToM_Map_JT.class);
types.add(EntityC_U1M_Map_RelKey_FK.class);
types.add(Uni_1ToM_Map_RelKey_FK.class);
types.add(EntityC.class);
types.add(EntityC_B1M_Map_RelKey_JT.class);
types.add(Bi_1ToM_Map_RelKey_JT.class);
OpenJPAEntityManagerFactorySPI emf = createEMF2_0(types);
EntityManager em = emf.createEntityManager();
try {
// trigger table creation
em.getTransaction().begin();
em.getTransaction().commit();
// on some databases KEY is a forbidden name for columns.
String keyColumn = getDbDictioary(emf).getInvalidColumnWordSet().contains("KEY")
? "KEY0"
: "KEY";
assertSQLFragnments(sql, "CREATE TABLE C_U1M_Map_FK", "Uni1MFK_ID", keyColumn);
assertSQLFragnments(sql, "CREATE TABLE Bi1M_Map_JT_C", "B_ID", "C_ID");
assertSQLFragnments(sql, "CREATE TABLE C_U1M_Map_RelKey_FK", "Uni1MFK_ID");
assertSQLFragnments(sql, "CREATE TABLE Bi1M_Map_RelKey_JT_C", "B_ID", "C_ID");
crudUni1MMapFK(em);
crudBi1MMapJT(em);
crudUni1MMapRelKeyFK(em);
crudBi1MMapRelKeyJT(em);
} catch (Exception e) {
e.printStackTrace();
fail("OneToMany mapping failed with exception message: " + e.getMessage());
} finally {
em.close();
emf.close();
}
}
public void crudUni1MMapFK(EntityManager em) {
//create
Uni_1ToM_Map_FK u = new Uni_1ToM_Map_FK();
u.setName("u");
Map<String, EntityC_U1M_Map_FK> cs = new HashMap<>();
EntityC_U1M_Map_FK c1 = new EntityC_U1M_Map_FK();
c1.setName("c1");
cs.put(c1.getName(), c1);
EntityC_U1M_Map_FK c2 = new EntityC_U1M_Map_FK();
c2.setName("c2");
cs.put(c2.getName(), c2);
u.setEntityCs(cs);
em.persist(u);
em.persist(c1);
em.persist(c2);
em.getTransaction().begin();
em.getTransaction().commit();
//update by adding a new C
cs = u.getEntityCs();
u.setName("newName");
EntityC_U1M_Map_FK c3 = new EntityC_U1M_Map_FK();
c3.setName("c3");
cs.put(c3.getName(), c3);
em.persist(c3);
em.getTransaction().begin();
em.getTransaction().commit();
// update by removing a c and then add this c to a new u
em.getTransaction().begin();
EntityC_U1M_Map_FK c4 = cs.remove("c1");
Uni_1ToM_Map_FK u2 = new Uni_1ToM_Map_FK();
u2.setName("u2");
Map<String, EntityC_U1M_Map_FK> cs2 = new HashMap<>();
cs2.put(c4.getName(), c4);
u2.setEntityCs(cs2);
em.persist(u2);
em.getTransaction().commit();
em.clear();
//query
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();
//find
long id = u1.getId();
Uni_1ToM_Map_FK findU = em.find(Uni_1ToM_Map_FK.class, id);
assertEquals(u, findU);
//remove
em.getTransaction().begin();
em.remove(findU);
em.getTransaction().commit();
}
public void crudBi1MMapJT(EntityManager em) {
Bi_1ToM_Map_JT b = new Bi_1ToM_Map_JT();
b.setName("b");
Map<String, EntityC_B1M_Map_JT> cs = new HashMap<>();
EntityC_B1M_Map_JT c = new EntityC_B1M_Map_JT();
c.setName("c");
c.setBi1mjt(b);
cs.put(c.getName(), c);
b.setEntityCs(cs);
em.persist(b);
em.persist(c);
em.getTransaction().begin();
em.getTransaction().commit();
//update
em.getTransaction().begin();
cs = b.getEntityCs();
b.setName("newName");
EntityC_B1M_Map_JT c1 = new EntityC_B1M_Map_JT();
c1.setName("c1");
cs.put(c1.getName(), c1);
c1.setBi1mjt(b);
em.persist(c1);
em.getTransaction().commit();
em.clear();
//query
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();
// query the owner
q = em.createQuery("SELECT c FROM EntityC_B1M_Map_JT c");
List<EntityC_B1M_Map_JT> cs1 = q.getResultList();
assertEquals(2, cs.size());
em.clear();
//find
long id = b1.getId();
Bi_1ToM_Map_JT b2 = em.find(Bi_1ToM_Map_JT.class, id);
assertEquals(b, b2);
//remove
em.getTransaction().begin();
em.remove(b2);
em.getTransaction().commit();
}
public void crudUni1MMapRelKeyFK(EntityManager em) {
//create
Uni_1ToM_Map_RelKey_FK u = new Uni_1ToM_Map_RelKey_FK();
u.setName("u");
Map<EntityC, EntityC_U1M_Map_RelKey_FK> cs = new HashMap<>();
EntityC_U1M_Map_RelKey_FK c1 = new EntityC_U1M_Map_RelKey_FK();
c1.setName("c1");
EntityC cKey1 = new EntityC();
cKey1.setName("cKey1");
cs.put(cKey1, c1);
EntityC_U1M_Map_RelKey_FK c2 = new EntityC_U1M_Map_RelKey_FK();
c2.setName("c2");
EntityC cKey2 = new EntityC();
cKey2.setName("cKey2");
cs.put(cKey2, c1);
cs.put(cKey2, c2);
u.setEntityCs(cs);
em.persist(u);
em.persist(c1);
em.persist(c2);
em.persist(cKey1);
em.persist(cKey2);
em.getTransaction().begin();
em.getTransaction().commit();
//update by adding a new C
em.getTransaction().begin();
cs = u.getEntityCs();
u.setName("newName");
EntityC_U1M_Map_RelKey_FK c3 = new EntityC_U1M_Map_RelKey_FK();
c3.setName("c3");
EntityC cKey3 = new EntityC();
cKey3.setName("cKey3");
cs.put(cKey3, c3);
em.persist(c3);
em.persist(cKey3);
em.getTransaction().commit();
// update by removing a c and then add this c to a new u
em.getTransaction().begin();
EntityC_U1M_Map_RelKey_FK c4 = cs.remove(cKey1);
Uni_1ToM_Map_RelKey_FK u2 = new Uni_1ToM_Map_RelKey_FK();
u2.setName("u2");
Map<EntityC, EntityC_U1M_Map_RelKey_FK> cs2 = new HashMap<>();
cs2.put(cKey1, c4);
u2.setEntityCs(cs2);
em.persist(u2);
em.getTransaction().commit();
em.clear();
//query
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();
//find
long id = u1.getId();
Uni_1ToM_Map_RelKey_FK findU = em.find(Uni_1ToM_Map_RelKey_FK.class, id);
assertEquals(u, findU);
//remove
em.getTransaction().begin();
em.remove(findU);
em.getTransaction().commit();
}
public void crudBi1MMapRelKeyJT(EntityManager em) {
Bi_1ToM_Map_RelKey_JT b = new Bi_1ToM_Map_RelKey_JT();
b.setName("b");
Map<EntityC, EntityC_B1M_Map_RelKey_JT> cs = new HashMap<>();
EntityC_B1M_Map_RelKey_JT c = new EntityC_B1M_Map_RelKey_JT();
c.setName("c");
c.setBi1mjt(b);
EntityC cKey = new EntityC();
cKey.setName("cKey");
cs.put(cKey, c);
b.setEntityCs(cs);
em.persist(b);
em.persist(c);
em.persist(cKey);
em.getTransaction().begin();
em.getTransaction().commit();
//update
em.getTransaction().begin();
cs = b.getEntityCs();
b.setName("newName");
EntityC_B1M_Map_RelKey_JT c1 = new EntityC_B1M_Map_RelKey_JT();
c1.setName("c1");
EntityC cKey1 = new EntityC();
cKey1.setName("cKey1");
cs.put(cKey1, c1);
c1.setBi1mjt(b);
em.persist(c1);
em.persist(cKey1);
em.getTransaction().commit();
em.clear();
//query
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();
// query the owner
q = em.createQuery("SELECT c FROM EntityC_B1M_Map_RelKey_JT c where c.name = 'c'");
EntityC_B1M_Map_RelKey_JT newC = (EntityC_B1M_Map_RelKey_JT)q.getSingleResult();
assertEquals(newC, c);
em.clear();
//find
long id = b1.getId();
Bi_1ToM_Map_RelKey_JT b2 = em.find(Bi_1ToM_Map_RelKey_JT.class, id);
assertEquals(b, b2);
//remove
em.getTransaction().begin();
em.remove(b2);
em.getTransaction().commit();
}
public void testUniManyToOneUsingJoinTable() {
List<Class<?>> types = new ArrayList<>();
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<>();
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<String,Object> map = new HashMap<>();
map.put("openjpa.jdbc.JDBCListeners",
new JDBCListener[] {
this.new Listener()
});
map.put("openjpa.jdbc.SynchronizeMappings",
"buildSchema(ForeignKeys=true,SchemaAction='drop,add')");
map.put(PERSISTENT_CLASS_LIST, types);
return (OpenJPAEntityManagerFactorySPI)
createContainerEMF("persistence_2_0",
"org/apache/openjpa/persistence/compat/" +
"persistence_2_0.xml", map);
}
void assertSQLFragnments(List<String> list, String... keys) {
if (SQLSniffer.matches(list, keys))
return;
fail("None of the following " + sql.size() + " SQL \r\n" +
toString(sql) + "\r\n contains all keys \r\n"
+ toString(Arrays.asList(keys)));
}
public String toString(List<String> list) {
StringBuilder buf = new StringBuilder();
for (String s : list)
buf.append(s).append("\r\n");
return buf.toString();
}
public class Listener extends AbstractJDBCListener {
@Override
public void beforeExecuteStatement(JDBCEvent event) {
if (event.getSQL() != null && sql != null) {
sql.add(event.getSQL());
sqlCount++;
}
}
}
}