001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one
003: * or more contributor license agreements. See the NOTICE file
004: * distributed with this work for additional information
005: * regarding copyright ownership. The ASF licenses this file
006: * to you under the Apache License, Version 2.0 (the
007: * "License"); you may not use this file except in compliance
008: * with the License. You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing,
013: * software distributed under the License is distributed on an
014: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015: * KIND, either express or implied. See the License for the
016: * specific language governing permissions and limitations
017: * under the License.
018: */
019: package org.apache.openjpa.persistence.jdbc.annotations;
020:
021: import javax.persistence.Query;
022:
023: import org.apache.openjpa.enhance.PersistenceCapable;
024: import org.apache.openjpa.persistence.OpenJPAEntityManager;
025: import org.apache.openjpa.persistence.test.SingleEMFTestCase;
026:
027: /**
028: * <p>Test embedded id classes.</p>
029: *
030: * @author Abe White
031: */
032: public class TestEmbeddedId extends SingleEMFTestCase {
033:
034: EmbeddedIdClass _oid;
035: EmbeddedIdClass _roid;
036:
037: public void setUp() {
038: setUp(EmbeddedIdEntity.class, EmbeddedIdClass.class,
039: CLEAR_TABLES);
040:
041: _oid = new EmbeddedIdClass();
042: _oid.setPk1(1);
043: _oid.setPk2(2);
044:
045: EmbeddedIdEntity e = new EmbeddedIdEntity();
046: e.setId(_oid);
047: e.setValue("e");
048:
049: _roid = new EmbeddedIdClass();
050: _roid.setPk1(2);
051: _roid.setPk2(3);
052:
053: EmbeddedIdEntity rel = new EmbeddedIdEntity();
054: rel.setId(_roid);
055: rel.setValue("r");
056: e.setRelation(rel);
057:
058: OpenJPAEntityManager em = emf.createEntityManager();
059: em.getTransaction().begin();
060: em.persistAll(e, rel);
061: em.getTransaction().commit();
062: em.close();
063: }
064:
065: public void testGetObjectId() {
066: OpenJPAEntityManager em = emf.createEntityManager();
067: EmbeddedIdEntity e = em.find(EmbeddedIdEntity.class, _oid);
068: assertNotNull(e);
069: assertEquals("e", e.getValue());
070: assertNull(e.getMappingOverrideRelation());
071: assertNotNull(e.getRelation());
072: assertEquals("r", e.getRelation().getValue());
073:
074: assertEquals(_oid, em.getObjectId(e));
075: assertEquals(_roid, em.getObjectId(e.getRelation()));
076: assertEquals(_oid, e.getId());
077: assertEquals(_roid, e.getRelation().getId());
078: assertNull(((PersistenceCapable) e.getId())
079: .pcGetGenericContext());
080: em.close();
081: }
082:
083: public void testMutateEmbeddedIdFieldValueOfNew() {
084: EmbeddedIdEntity e1 = new EmbeddedIdEntity();
085: e1.setValue("e1");
086: EmbeddedIdEntity e2 = new EmbeddedIdEntity();
087: e2.setValue("e2");
088: EmbeddedIdClass id = new EmbeddedIdClass();
089: e2.setId(id);
090:
091: OpenJPAEntityManager em = emf.createEntityManager();
092: em.getTransaction().begin();
093: em.persistAll(e1, e2);
094:
095: EmbeddedIdClass oid = new EmbeddedIdClass();
096: oid.setPk1(4);
097: oid.setPk2(5);
098: e1.setId(oid);
099: e2.getId().setPk1(6);
100: e2.getId().setPk2(7);
101: em.getTransaction().commit();
102:
103: EmbeddedIdClass oid1 = e1.getId();
104: assertEquals(oid1, em.getObjectId(e1));
105: assertEquals(4, oid1.getPk1());
106: assertEquals(5, oid1.getPk2());
107:
108: EmbeddedIdClass oid2 = e2.getId();
109: // pcl: 30 October 2007: this fails currently; commenting out.
110: // See OPENJPA-425
111: //assertEquals(oid2, em.getObjectId(e2));
112: assertEquals(6, oid2.getPk1());
113: assertEquals(7, oid2.getPk2());
114: em.close();
115:
116: em = emf.createEntityManager();
117: e1 = em.find(EmbeddedIdEntity.class, oid1);
118: e2 = em.find(EmbeddedIdEntity.class, oid2);
119: assertEquals(oid1, em.getObjectId(e1));
120: assertEquals(oid2, em.getObjectId(e2));
121: assertEquals(oid1, e1.getId());
122: assertEquals(oid2, e2.getId());
123: em.close();
124: }
125:
126: public void testMutateEmbeddedIdFieldValueOfExisting() {
127: OpenJPAEntityManager em = emf.createEntityManager();
128: em.getTransaction().begin();
129:
130: EmbeddedIdEntity e = em.find(EmbeddedIdEntity.class, _oid);
131: e.setValue("changed");
132: try {
133: e.getId().setPk1(9);
134: em.getTransaction().commit();
135: fail("Committed with changed oid field.");
136: } catch (RuntimeException re) {
137: if (em.getTransaction().isActive())
138: em.getTransaction().rollback();
139: }
140: em.close();
141: }
142:
143: public void testDetachAttach() {
144: OpenJPAEntityManager em = emf.createEntityManager();
145: EmbeddedIdEntity e = em.find(EmbeddedIdEntity.class, _oid);
146: e.getRelation();
147: em.close();
148:
149: e.setValue("echanged");
150: e.getRelation().setValue("rchanged");
151:
152: em = emf.createEntityManager();
153: em.getTransaction().begin();
154: EmbeddedIdEntity me = (EmbeddedIdEntity) em.mergeAll(e, e
155: .getRelation())[0];
156: assertTrue(me != e);
157: assertNotNull(me.getRelation());
158: assertTrue(me.getRelation() != e.getRelation());
159: assertEquals("echanged", me.getValue());
160: assertEquals("rchanged", me.getRelation().getValue());
161: assertEquals(_oid, me.getId());
162: assertEquals(_oid, em.getObjectId(me));
163: assertEquals(_roid, me.getRelation().getId());
164: assertEquals(_roid, em.getObjectId(me.getRelation()));
165: em.getTransaction().commit();
166: em.close();
167: }
168:
169: public void testQuery() {
170: OpenJPAEntityManager em = emf.createEntityManager();
171: Query q = em.createQuery("select e from EmbeddedIdEntity e "
172: + "where e.id.pk1 = 1");
173: EmbeddedIdEntity e = (EmbeddedIdEntity) q.getSingleResult();
174: assertEquals(_oid, e.getId());
175: assertEquals("e", e.getValue());
176:
177: q = em.createQuery("select e.id.pk2 from EmbeddedIdEntity e "
178: + "where e.id.pk1 = 1");
179: assertEquals(new Long(_oid.getPk2()), q.getSingleResult());
180:
181: q = em.createQuery("select e.id from EmbeddedIdEntity e "
182: + "where e.id.pk1 = 1");
183: assertEquals(_oid, q.getSingleResult());
184: em.close();
185: }
186:
187: public void testAutoAssigned() {
188: // begin with null id object
189: OpenJPAEntityManager em = emf.createEntityManager();
190: em.getTransaction().begin();
191: EmbeddedIdEntity e = new EmbeddedIdEntity();
192: em.persist(e);
193: EmbeddedIdClass oid = e.getId();
194: assertNotNull(oid);
195: assertTrue(oid.getPk3() != 0);
196: assertEquals(oid, em.getObjectId(e));
197: em.getTransaction().commit();
198: assertEquals(oid, em.getObjectId(e));
199: em.close();
200:
201: em = emf.createEntityManager();
202: e = em.find(EmbeddedIdEntity.class, oid);
203: assertEquals(oid, em.getObjectId(e));
204: em.close();
205:
206: // begin with non-null id object
207: em = emf.createEntityManager();
208: em.getTransaction().begin();
209: e = new EmbeddedIdEntity();
210: oid = new EmbeddedIdClass();
211: oid.setPk1(4);
212: oid.setPk2(5);
213: e.setId(oid);
214: em.persist(e);
215: oid = e.getId();
216: assertEquals(4, oid.getPk1());
217: assertEquals(5, oid.getPk2());
218: assertTrue(oid.getPk3() != 0);
219: assertEquals(oid, em.getObjectId(e));
220: em.getTransaction().commit();
221: assertEquals(oid, em.getObjectId(e));
222: em.close();
223:
224: em = emf.createEntityManager();
225: e = em.find(EmbeddedIdEntity.class, oid);
226: assertEquals(oid, em.getObjectId(e));
227: em.close();
228:
229: // flush before accessing id field
230: em = emf.createEntityManager();
231: em.getTransaction().begin();
232: e = new EmbeddedIdEntity();
233: em.persist(e);
234: em.getTransaction().commit();
235: oid = e.getId();
236: assertTrue(oid.getPk3() != 0);
237: assertEquals(oid, em.getObjectId(e));
238: em.close();
239:
240: em = emf.createEntityManager();
241: e = em.find(EmbeddedIdEntity.class, oid);
242: assertEquals(oid, em.getObjectId(e));
243: em.close();
244: }
245: }
|