/* | |
* 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.jdbc.annotations; | |
import javax.persistence.Query; | |
import org.apache.openjpa.enhance.PersistenceCapable; | |
import org.apache.openjpa.persistence.OpenJPAEntityManager; | |
import org.apache.openjpa.persistence.test.SingleEMFTestCase; | |
/** | |
* <p>Test embedded id classes.</p> | |
* | |
* @author Abe White | |
*/ | |
public class TestEmbeddedId | |
extends SingleEMFTestCase { | |
EmbeddedIdClass _oid; | |
EmbeddedIdClass _roid; | |
public void setUp() { | |
setUp(EmbeddedIdEntity.class, EmbeddedIdClass.class, CLEAR_TABLES); | |
_oid = new EmbeddedIdClass(); | |
_oid.setPk1(1); | |
_oid.setPk2(2); | |
EmbeddedIdEntity e = new EmbeddedIdEntity(); | |
e.setId(_oid); | |
e.setValue("e"); | |
_roid = new EmbeddedIdClass(); | |
_roid.setPk1(2); | |
_roid.setPk2(3); | |
EmbeddedIdEntity rel = new EmbeddedIdEntity(); | |
rel.setId(_roid); | |
rel.setValue("r"); | |
e.setRelation(rel); | |
OpenJPAEntityManager em = emf.createEntityManager(); | |
em.getTransaction().begin(); | |
em.persistAll(e, rel); | |
em.getTransaction().commit(); | |
em.close(); | |
} | |
public void testGetObjectId() { | |
OpenJPAEntityManager em = emf.createEntityManager(); | |
EmbeddedIdEntity e = em.find(EmbeddedIdEntity.class, _oid); | |
assertNotNull(e); | |
assertEquals("e", e.getValue()); | |
assertNull(e.getMappingOverrideRelation()); | |
assertNotNull(e.getRelation()); | |
assertEquals("r", e.getRelation().getValue()); | |
assertEquals(_oid, em.getObjectId(e)); | |
assertEquals(_roid, em.getObjectId(e.getRelation())); | |
assertEquals(_oid, e.getId()); | |
assertEquals(_roid, e.getRelation().getId()); | |
assertNull(((PersistenceCapable) e.getId()).pcGetGenericContext()); | |
em.close(); | |
} | |
public void testMutateEmbeddedIdFieldValueOfNew() { | |
EmbeddedIdEntity e1 = new EmbeddedIdEntity(); | |
e1.setValue("e1"); | |
EmbeddedIdEntity e2 = new EmbeddedIdEntity(); | |
e2.setValue("e2"); | |
EmbeddedIdClass id = new EmbeddedIdClass(); | |
e2.setId(id); | |
OpenJPAEntityManager em = emf.createEntityManager(); | |
em.getTransaction().begin(); | |
em.persistAll(e1, e2); | |
EmbeddedIdClass oid = new EmbeddedIdClass(); | |
oid.setPk1(4); | |
oid.setPk2(5); | |
e1.setId(oid); | |
e2.getId().setPk1(6); | |
e2.getId().setPk2(7); | |
em.getTransaction().commit(); | |
EmbeddedIdClass oid1 = e1.getId(); | |
assertEquals(oid1, em.getObjectId(e1)); | |
assertEquals(4, oid1.getPk1()); | |
assertEquals(5, oid1.getPk2()); | |
EmbeddedIdClass oid2 = e2.getId(); | |
// pcl: 30 October 2007: this fails currently; commenting out. | |
// See OPENJPA-425 | |
//assertEquals(oid2, em.getObjectId(e2)); | |
assertEquals(6, oid2.getPk1()); | |
assertEquals(7, oid2.getPk2()); | |
em.close(); | |
em = emf.createEntityManager(); | |
e1 = em.find(EmbeddedIdEntity.class, oid1); | |
e2 = em.find(EmbeddedIdEntity.class, oid2); | |
assertEquals(oid1, em.getObjectId(e1)); | |
assertEquals(oid2, em.getObjectId(e2)); | |
assertEquals(oid1, e1.getId()); | |
assertEquals(oid2, e2.getId()); | |
em.close(); | |
} | |
public void testMutateEmbeddedIdFieldValueOfExisting() { | |
OpenJPAEntityManager em = emf.createEntityManager(); | |
em.getTransaction().begin(); | |
EmbeddedIdEntity e = em.find(EmbeddedIdEntity.class, _oid); | |
e.setValue("changed"); | |
try { | |
e.getId().setPk1(9); | |
em.getTransaction().commit(); | |
fail("Committed with changed oid field."); | |
} catch (RuntimeException re) { | |
if (em.getTransaction().isActive()) | |
em.getTransaction().rollback(); | |
} | |
em.close(); | |
} | |
public void testDetachAttach() { | |
OpenJPAEntityManager em = emf.createEntityManager(); | |
EmbeddedIdEntity e = em.find(EmbeddedIdEntity.class, _oid); | |
e.getRelation(); | |
em.close(); | |
e.setValue("echanged"); | |
e.getRelation().setValue("rchanged"); | |
em = emf.createEntityManager(); | |
em.getTransaction().begin(); | |
EmbeddedIdEntity me = (EmbeddedIdEntity) em.mergeAll(e, | |
e.getRelation())[0]; | |
assertTrue(me != e); | |
assertNotNull(me.getRelation()); | |
assertTrue(me.getRelation() != e.getRelation()); | |
assertEquals("echanged", me.getValue()); | |
assertEquals("rchanged", me.getRelation().getValue()); | |
assertEquals(_oid, me.getId()); | |
assertEquals(_oid, em.getObjectId(me)); | |
assertEquals(_roid, me.getRelation().getId()); | |
assertEquals(_roid, em.getObjectId(me.getRelation())); | |
em.getTransaction().commit(); | |
em.close(); | |
} | |
public void testQuery() { | |
OpenJPAEntityManager em = emf.createEntityManager(); | |
Query q = em.createQuery("select e from EmbeddedIdEntity e " | |
+ "where e.id.pk1 = 1"); | |
EmbeddedIdEntity e = (EmbeddedIdEntity) q.getSingleResult(); | |
assertEquals(_oid, e.getId()); | |
assertEquals("e", e.getValue()); | |
q = em.createQuery("select e.id.pk2 from EmbeddedIdEntity e " | |
+ "where e.id.pk1 = 1"); | |
assertEquals(new Long(_oid.getPk2()), q.getSingleResult()); | |
q = em.createQuery("select e.id from EmbeddedIdEntity e " | |
+ "where e.id.pk1 = 1"); | |
assertEquals(_oid, q.getSingleResult()); | |
em.close(); | |
} | |
public void testAutoAssigned() { | |
// begin with null id object | |
OpenJPAEntityManager em = emf.createEntityManager(); | |
em.getTransaction().begin(); | |
EmbeddedIdEntity e = new EmbeddedIdEntity(); | |
em.persist(e); | |
EmbeddedIdClass oid = e.getId(); | |
assertNotNull(oid); | |
assertTrue(oid.getPk3() != 0); | |
assertEquals(oid, em.getObjectId(e)); | |
em.getTransaction().commit(); | |
assertEquals(oid, em.getObjectId(e)); | |
em.close(); | |
em = emf.createEntityManager(); | |
e = em.find(EmbeddedIdEntity.class, oid); | |
assertEquals(oid, em.getObjectId(e)); | |
em.close(); | |
// begin with non-null id object | |
em = emf.createEntityManager(); | |
em.getTransaction().begin(); | |
e = new EmbeddedIdEntity(); | |
oid = new EmbeddedIdClass(); | |
oid.setPk1(4); | |
oid.setPk2(5); | |
e.setId(oid); | |
em.persist(e); | |
oid = e.getId(); | |
assertEquals(4, oid.getPk1()); | |
assertEquals(5, oid.getPk2()); | |
assertTrue(oid.getPk3() != 0); | |
assertEquals(oid, em.getObjectId(e)); | |
em.getTransaction().commit(); | |
assertEquals(oid, em.getObjectId(e)); | |
em.close(); | |
em = emf.createEntityManager(); | |
e = em.find(EmbeddedIdEntity.class, oid); | |
assertEquals(oid, em.getObjectId(e)); | |
em.close(); | |
// flush before accessing id field | |
em = emf.createEntityManager(); | |
em.getTransaction().begin(); | |
e = new EmbeddedIdEntity(); | |
em.persist(e); | |
em.getTransaction().commit(); | |
oid = e.getId(); | |
assertTrue(oid.getPk3() != 0); | |
assertEquals(oid, em.getObjectId(e)); | |
em.close(); | |
em = emf.createEntityManager(); | |
e = em.find(EmbeddedIdEntity.class, oid); | |
assertEquals(oid, em.getObjectId(e)); | |
em.close(); | |
} | |
} |