blob: 6eb8fc66e574165fc55302c8fd54b8b592d39f1b [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.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();
}
}