Lines 12-17
Link Here
|
12 |
******************************************************************************/ |
12 |
******************************************************************************/ |
13 |
package org.eclipse.persistence.testing.tests.jpa.fetchgroups; |
13 |
package org.eclipse.persistence.testing.tests.jpa.fetchgroups; |
14 |
|
14 |
|
|
|
15 |
import java.io.ByteArrayInputStream; |
16 |
import java.io.ObjectInputStream; |
17 |
import java.io.ObjectOutputStream; |
15 |
import java.io.IOException; |
18 |
import java.io.IOException; |
16 |
import java.io.Serializable; |
19 |
import java.io.Serializable; |
17 |
import java.util.ArrayList; |
20 |
import java.util.ArrayList; |
Lines 65-72
Link Here
|
65 |
|
68 |
|
66 |
suite.addTest(new SimpleSerializeFetchGroupTests("testSetup")); |
69 |
suite.addTest(new SimpleSerializeFetchGroupTests("testSetup")); |
67 |
suite.addTest(new SimpleSerializeFetchGroupTests("verifyWriteReplaceOnFetchGroup")); |
70 |
suite.addTest(new SimpleSerializeFetchGroupTests("verifyWriteReplaceOnFetchGroup")); |
68 |
suite.addTest(new SimpleSerializeFetchGroupTests("findMinimalFetchGroup")); |
|
|
69 |
suite.addTest(new SimpleSerializeFetchGroupTests("findEmptyFetchGroup_setUnfetchedSalary")); |
70 |
suite.addTest(new SimpleSerializeFetchGroupTests("verifyAddAttributeInDetachedEntityFetchGroup")); |
71 |
suite.addTest(new SimpleSerializeFetchGroupTests("verifyAddAttributeInDetachedEntityFetchGroup")); |
71 |
suite.addTest(new SimpleSerializeFetchGroupTests("singleResultEmptyFetchGroup")); |
72 |
suite.addTest(new SimpleSerializeFetchGroupTests("singleResultEmptyFetchGroup")); |
72 |
suite.addTest(new SimpleSerializeFetchGroupTests("resultListEmptyFetchGroup")); |
73 |
suite.addTest(new SimpleSerializeFetchGroupTests("resultListEmptyFetchGroup")); |
Lines 76-94
Link Here
|
76 |
suite.addTest(new SimpleSerializeFetchGroupTests("employeeNamesFetchGroup")); |
77 |
suite.addTest(new SimpleSerializeFetchGroupTests("employeeNamesFetchGroup")); |
77 |
suite.addTest(new SimpleSerializeFetchGroupTests("joinFetchEmployeeAddressWithDynamicFetchGroup")); |
78 |
suite.addTest(new SimpleSerializeFetchGroupTests("joinFetchEmployeeAddressWithDynamicFetchGroup")); |
78 |
suite.addTest(new SimpleSerializeFetchGroupTests("joinFetchEmployeeAddressPhoneWithDynamicFetchGroup")); |
79 |
suite.addTest(new SimpleSerializeFetchGroupTests("joinFetchEmployeeAddressPhoneWithDynamicFetchGroup")); |
79 |
suite.addTest(new SimpleSerializeFetchGroupTests("verifyUnfetchedAttributes")); |
|
|
80 |
suite.addTest(new SimpleSerializeFetchGroupTests("verifyFetchedRelationshipAttributes")); |
80 |
suite.addTest(new SimpleSerializeFetchGroupTests("verifyFetchedRelationshipAttributes")); |
81 |
suite.addTest(new SimpleSerializeFetchGroupTests("simpleSerializeAndMerge")); |
81 |
if (!isJPA10()) { |
82 |
suite.addTest(new SimpleSerializeFetchGroupTests("partialMerge")); |
82 |
suite.addTest(new SimpleSerializeFetchGroupTests("findMinimalFetchGroup")); |
83 |
suite.addTest(new SimpleSerializeFetchGroupTests("copyGroupMerge")); |
83 |
suite.addTest(new SimpleSerializeFetchGroupTests("findEmptyFetchGroup_setUnfetchedSalary")); |
84 |
suite.addTest(new SimpleSerializeFetchGroupTests("copyGroupMerge2")); |
84 |
suite.addTest(new SimpleSerializeFetchGroupTests("verifyUnfetchedAttributes")); |
85 |
suite.addTest(new SimpleSerializeFetchGroupTests("copyWithPk")); |
85 |
suite.addTest(new SimpleSerializeFetchGroupTests("simpleSerializeAndMerge")); |
86 |
suite.addTest(new SimpleSerializeFetchGroupTests("copyWithPkUseFullGroup")); |
86 |
suite.addTest(new SimpleSerializeFetchGroupTests("partialMerge")); |
87 |
suite.addTest(new SimpleSerializeFetchGroupTests("copyWithoutPk")); |
87 |
suite.addTest(new SimpleSerializeFetchGroupTests("copyGroupMerge")); |
88 |
suite.addTest(new SimpleSerializeFetchGroupTests("copyWithoutPkUseFullGroup")); |
88 |
suite.addTest(new SimpleSerializeFetchGroupTests("copyGroupMerge2")); |
89 |
suite.addTest(new SimpleSerializeFetchGroupTests("copyNoCascade")); |
89 |
suite.addTest(new SimpleSerializeFetchGroupTests("copyWithPk")); |
90 |
suite.addTest(new SimpleSerializeFetchGroupTests("copyCascadePrivateParts")); |
90 |
suite.addTest(new SimpleSerializeFetchGroupTests("copyWithPkUseFullGroup")); |
91 |
suite.addTest(new SimpleSerializeFetchGroupTests("copyCascadeAllParts")); |
91 |
suite.addTest(new SimpleSerializeFetchGroupTests("copyWithoutPk")); |
|
|
92 |
suite.addTest(new SimpleSerializeFetchGroupTests("copyWithoutPkUseFullGroup")); |
93 |
suite.addTest(new SimpleSerializeFetchGroupTests("copyNoCascade")); |
94 |
suite.addTest(new SimpleSerializeFetchGroupTests("copyCascadePrivateParts")); |
95 |
suite.addTest(new SimpleSerializeFetchGroupTests("copyCascadeAllParts")); |
96 |
} |
92 |
|
97 |
|
93 |
return suite; |
98 |
return suite; |
94 |
} |
99 |
} |
Lines 96-105
Link Here
|
96 |
@Test |
101 |
@Test |
97 |
public void verifyWriteReplaceOnFetchGroup() throws Exception { |
102 |
public void verifyWriteReplaceOnFetchGroup() throws Exception { |
98 |
EntityFetchGroup fg = new EntityFetchGroup(new String[]{"basic", "a"}); |
103 |
EntityFetchGroup fg = new EntityFetchGroup(new String[]{"basic", "a"}); |
99 |
// fg.addAttribute("basic"); |
104 |
//fg.addAttribute("basic"); |
100 |
// fg.addAttribute("a.b"); |
105 |
//fg.addAttribute("a.b"); |
101 |
|
106 |
|
102 |
// assertTrue(fg.getClass() == FetchGroup.class); |
107 |
//assertTrue(fg.getClass() == FetchGroup.class); |
103 |
|
108 |
|
104 |
FetchGroup serFG = serialize(fg); |
109 |
FetchGroup serFG = serialize(fg); |
105 |
|
110 |
|
Lines 110-124
Link Here
|
110 |
AttributeItem basicFI = serFG.getItem("basic"); |
115 |
AttributeItem basicFI = serFG.getItem("basic"); |
111 |
|
116 |
|
112 |
assertNotNull(basicFI); |
117 |
assertNotNull(basicFI); |
113 |
// assertTrue(basicFI instanceof DetachedFetchItem); |
118 |
//assertTrue(basicFI instanceof DetachedFetchItem); |
114 |
|
119 |
|
115 |
AttributeItem aFI = serFG.getItem("a"); |
120 |
AttributeItem aFI = serFG.getItem("a"); |
116 |
|
121 |
|
117 |
assertNotNull(aFI); |
122 |
assertNotNull(aFI); |
118 |
// assertTrue(aFI instanceof DetachedFetchItem); |
123 |
//assertTrue(aFI instanceof DetachedFetchItem); |
119 |
// serialized EntityFetchGroup is always flat - doesn't have nested groups. |
124 |
// serialized EntityFetchGroup is always flat - doesn't have nested groups. |
120 |
assertNull(aFI.getGroup()); |
125 |
assertNull(aFI.getGroup()); |
121 |
/* assertNotNull(aFI.getGroup()); |
126 |
/*assertNotNull(aFI.getGroup()); |
122 |
assertTrue(aFI.getGroup() instanceof EntityFetchGroup); |
127 |
assertTrue(aFI.getGroup() instanceof EntityFetchGroup); |
123 |
EntityFetchGroup aEFG = (EntityFetchGroup) aFI.getGroup(); |
128 |
EntityFetchGroup aEFG = (EntityFetchGroup) aFI.getGroup(); |
124 |
assertNull(aEFG.getParent()); |
129 |
assertNull(aEFG.getParent()); |
Lines 127-133
Link Here
|
127 |
AttributeItem bFI = aEFG.getItem("b"); |
132 |
AttributeItem bFI = aEFG.getItem("b"); |
128 |
|
133 |
|
129 |
assertNotNull(bFI); |
134 |
assertNotNull(bFI); |
130 |
// assertTrue(bFI instanceof DetachedFetchItem); |
135 |
//assertTrue(bFI instanceof DetachedFetchItem); |
131 |
assertNull(bFI.getGroup());*/ |
136 |
assertNull(bFI.getGroup());*/ |
132 |
} |
137 |
} |
133 |
|
138 |
|
Lines 194-250
Link Here
|
194 |
public void findEmptyFetchGroup_setUnfetchedSalary() throws Exception { |
199 |
public void findEmptyFetchGroup_setUnfetchedSalary() throws Exception { |
195 |
EntityManager em = createEntityManager(); |
200 |
EntityManager em = createEntityManager(); |
196 |
int minId = minimumEmployeeId(em); |
201 |
int minId = minimumEmployeeId(em); |
|
|
202 |
try { |
203 |
beginTransaction(em); |
197 |
|
204 |
|
198 |
assertEquals(1, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
205 |
assertEquals(1, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
199 |
|
206 |
|
200 |
Map<String, Object> properties = new HashMap<String, Object>(); |
207 |
Map<String, Object> properties = new HashMap<String, Object>(); |
201 |
FetchGroup emptyFG = new FetchGroup(); |
208 |
FetchGroup emptyFG = new FetchGroup(); |
202 |
properties.put(QueryHints.FETCH_GROUP, emptyFG); |
209 |
properties.put(QueryHints.FETCH_GROUP, emptyFG); |
203 |
|
210 |
|
204 |
Employee emp = em.find(Employee.class, minId, properties); |
211 |
Employee emp = em.find(Employee.class, minId, properties); |
205 |
|
212 |
|
206 |
assertNotNull(emp); |
213 |
assertNotNull(emp); |
207 |
assertFetched(emp, emptyFG); |
214 |
assertFetched(emp, emptyFG); |
208 |
assertEquals(2, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
215 |
assertEquals(2, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
209 |
|
216 |
|
210 |
// Check Basics |
217 |
// Check Basics |
211 |
assertFetchedAttribute(emp, "id"); |
218 |
assertFetchedAttribute(emp, "id"); |
212 |
assertFetchedAttribute(emp, "version"); |
219 |
assertFetchedAttribute(emp, "version"); |
213 |
assertNotFetchedAttribute(emp, "firstName"); |
220 |
assertNotFetchedAttribute(emp, "firstName"); |
214 |
assertNotFetchedAttribute(emp, "lastName"); |
221 |
assertNotFetchedAttribute(emp, "lastName"); |
215 |
assertNotFetchedAttribute(emp, "gender"); |
222 |
assertNotFetchedAttribute(emp, "gender"); |
216 |
assertNotFetchedAttribute(emp, "salary"); |
223 |
assertNotFetchedAttribute(emp, "salary"); |
217 |
assertNotFetchedAttribute(emp, "startTime"); |
224 |
assertNotFetchedAttribute(emp, "startTime"); |
218 |
assertNotFetchedAttribute(emp, "endTime"); |
225 |
assertNotFetchedAttribute(emp, "endTime"); |
219 |
if (emp.getPeriod() != null) { |
226 |
if (emp.getPeriod() != null) { |
220 |
assertFetchedAttribute(emp.getPeriod(), "startDate"); |
227 |
assertFetchedAttribute(emp.getPeriod(), "startDate"); |
221 |
assertFetchedAttribute(emp.getPeriod(), "endDate"); |
228 |
assertFetchedAttribute(emp.getPeriod(), "endDate"); |
222 |
} |
229 |
} |
223 |
assertEquals(3, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
230 |
assertEquals(3, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
224 |
|
231 |
|
225 |
// Check Relationships |
232 |
// Check Relationships |
226 |
assertNotFetchedAttribute(emp, "address"); |
233 |
assertNotFetchedAttribute(emp, "address"); |
227 |
assertNotFetchedAttribute(emp, "manager"); |
234 |
assertNotFetchedAttribute(emp, "manager"); |
228 |
assertNotFetchedAttribute(emp, "phoneNumbers"); |
235 |
assertNotFetchedAttribute(emp, "phoneNumbers"); |
229 |
assertNotFetchedAttribute(emp, "projects"); |
236 |
assertNotFetchedAttribute(emp, "projects"); |
230 |
|
237 |
|
231 |
emp.setSalary(1); |
238 |
emp.setSalary(1); |
232 |
|
239 |
|
233 |
assertFetchedAttribute(emp, "salary"); |
240 |
assertFetchedAttribute(emp, "salary"); |
234 |
|
241 |
|
235 |
assertEquals(3, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
242 |
assertEquals(3, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
236 |
assertNoFetchGroup(emp); |
243 |
assertNoFetchGroup(emp); |
237 |
|
244 |
|
238 |
emp.getAddress(); |
245 |
emp.getAddress(); |
239 |
|
246 |
|
240 |
assertEquals(4, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
247 |
assertEquals(4, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
241 |
assertNoFetchGroup(emp.getAddress()); |
248 |
assertNoFetchGroup(emp.getAddress()); |
242 |
|
249 |
|
243 |
emp.getPhoneNumbers().size(); |
250 |
emp.getPhoneNumbers().size(); |
244 |
|
251 |
|
245 |
assertEquals(5, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
252 |
assertEquals(5, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
246 |
for (PhoneNumber phone : emp.getPhoneNumbers()) { |
253 |
for (PhoneNumber phone : emp.getPhoneNumbers()) { |
247 |
assertNoFetchGroup(phone); |
254 |
assertNoFetchGroup(phone); |
|
|
255 |
} |
256 |
} finally { |
257 |
if (isTransactionActive(em)){ |
258 |
rollbackTransaction(em); |
259 |
} |
260 |
closeEntityManager(em); |
248 |
} |
261 |
} |
249 |
} |
262 |
} |
250 |
|
263 |
|
Lines 256-351
Link Here
|
256 |
public void verifyAddAttributeInDetachedEntityFetchGroup() { |
269 |
public void verifyAddAttributeInDetachedEntityFetchGroup() { |
257 |
EntityFetchGroup detFG = new EntityFetchGroup(new String[]{"basic", "a"}); |
270 |
EntityFetchGroup detFG = new EntityFetchGroup(new String[]{"basic", "a"}); |
258 |
|
271 |
|
259 |
// detFG.addAttribute("basic"); |
272 |
//detFG.addAttribute("basic"); |
260 |
// detFG.addAttribute("a.b"); |
273 |
//detFG.addAttribute("a.b"); |
261 |
|
274 |
|
262 |
// assertNull(detFG.getParent()); |
275 |
//assertNull(detFG.getParent()); |
263 |
assertEquals(2, detFG.getItems().size()); |
276 |
assertEquals(2, detFG.getItems().size()); |
264 |
|
277 |
|
265 |
AttributeItem basicItem = detFG.getItem("basic"); |
278 |
AttributeItem basicItem = detFG.getItem("basic"); |
266 |
assertNotNull(basicItem); |
279 |
assertNotNull(basicItem); |
267 |
assertEquals("basic", basicItem.getAttributeName()); |
280 |
assertEquals("basic", basicItem.getAttributeName()); |
268 |
// assertTrue(basicItem instanceof DetachedFetchItem); |
281 |
//assertTrue(basicItem instanceof DetachedFetchItem); |
269 |
assertNull(basicItem.getGroup()); |
282 |
assertNull(basicItem.getGroup()); |
270 |
assertSame(detFG, basicItem.getParent()); |
283 |
assertSame(detFG, basicItem.getParent()); |
271 |
// assertFalse(basicItem.useDefaultFetchGroup()); |
284 |
//assertFalse(basicItem.useDefaultFetchGroup()); |
272 |
|
285 |
|
273 |
AttributeItem aItem = detFG.getItem("a"); |
286 |
AttributeItem aItem = detFG.getItem("a"); |
274 |
assertNotNull(aItem); |
287 |
assertNotNull(aItem); |
275 |
assertEquals("a", aItem.getAttributeName()); |
288 |
assertEquals("a", aItem.getAttributeName()); |
276 |
// assertTrue(aItem instanceof DetachedFetchItem); |
289 |
//assertTrue(aItem instanceof DetachedFetchItem); |
277 |
// serialized EntityFetchGroup is always flat - doesn't have nested groups. |
290 |
// serialized EntityFetchGroup is always flat - doesn't have nested groups. |
278 |
//// assertNull(aItem.getGroup()); |
291 |
//assertNull(aItem.getGroup()); |
279 |
assertNull(aItem.getGroup()); |
292 |
assertNull(aItem.getGroup()); |
280 |
assertSame(detFG, aItem.getParent()); |
293 |
assertSame(detFG, aItem.getParent()); |
281 |
// assertFalse(aItem.useDefaultFetchGroup()); |
294 |
//assertFalse(aItem.useDefaultFetchGroup()); |
282 |
// assertTrue(aItem.getGroup() instanceof EntityFetchGroup); |
295 |
//assertTrue(aItem.getGroup() instanceof EntityFetchGroup); |
283 |
|
296 |
|
284 |
// EntityFetchGroup aFG = (EntityFetchGroup) aItem.getGroup(); |
297 |
//EntityFetchGroup aFG = (EntityFetchGroup) aItem.getGroup(); |
285 |
|
298 |
|
286 |
// assertEquals(1, aFG.getItems().size()); |
299 |
//assertEquals(1, aFG.getItems().size()); |
287 |
|
300 |
|
288 |
// AttributeItem bItem = aFG.getItem("b"); |
301 |
//AttributeItem bItem = aFG.getItem("b"); |
289 |
// assertNotNull(bItem); |
302 |
//assertNotNull(bItem); |
290 |
// assertEquals("b", bItem.getAttributeName()); |
303 |
//assertEquals("b", bItem.getAttributeName()); |
291 |
// assertTrue(bItem instanceof DetachedFetchItem); |
304 |
//assertTrue(bItem instanceof DetachedFetchItem); |
292 |
// assertNull(bItem.getGroup()); |
305 |
//assertNull(bItem.getGroup()); |
293 |
// assertSame(aFG, bItem.getParent()); |
306 |
//assertSame(aFG, bItem.getParent()); |
294 |
// assertFalse(bItem.useDefaultFetchGroup()); |
307 |
//assertFalse(bItem.useDefaultFetchGroup()); |
295 |
} |
308 |
} |
296 |
|
309 |
|
297 |
@Test |
310 |
@Test |
298 |
public void singleResultEmptyFetchGroup() throws Exception { |
311 |
public void singleResultEmptyFetchGroup() throws Exception { |
299 |
EntityManager em = createEntityManager(); |
312 |
EntityManager em = createEntityManager(); |
|
|
313 |
try { |
314 |
beginTransaction(em); |
300 |
|
315 |
|
301 |
Query query = em.createQuery("SELECT e FROM Employee e WHERE e.id = :ID"); |
316 |
Query query = em.createQuery("SELECT e FROM Employee e WHERE e.id = :ID"); |
302 |
query.setParameter("ID", minimumEmployeeId(em)); |
317 |
query.setParameter("ID", minimumEmployeeId(em)); |
303 |
FetchGroup emptyFG = new FetchGroup(); |
318 |
FetchGroup emptyFG = new FetchGroup(); |
304 |
query.setHint(QueryHints.FETCH_GROUP, emptyFG); |
319 |
query.setHint(QueryHints.FETCH_GROUP, emptyFG); |
305 |
|
320 |
|
306 |
Employee emp = (Employee) query.getSingleResult(); |
321 |
Employee emp = (Employee) query.getSingleResult(); |
307 |
|
322 |
|
308 |
assertNotNull(emp); |
323 |
assertNotNull(emp); |
309 |
assertFetched(emp, emptyFG); |
324 |
assertFetched(emp, emptyFG); |
310 |
assertEquals(2, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
325 |
assertEquals(2, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
311 |
|
326 |
|
312 |
// Check Basics |
327 |
// Check Basics |
313 |
assertFetchedAttribute(emp, "id"); |
328 |
assertFetchedAttribute(emp, "id"); |
314 |
assertFetchedAttribute(emp, "version"); |
329 |
assertFetchedAttribute(emp, "version"); |
315 |
assertNotFetchedAttribute(emp, "firstName"); |
330 |
assertNotFetchedAttribute(emp, "firstName"); |
316 |
assertNotFetchedAttribute(emp, "lastName"); |
331 |
assertNotFetchedAttribute(emp, "lastName"); |
317 |
assertNotFetchedAttribute(emp, "gender"); |
332 |
assertNotFetchedAttribute(emp, "gender"); |
318 |
assertNotFetchedAttribute(emp, "salary"); |
333 |
assertNotFetchedAttribute(emp, "salary"); |
319 |
assertNotFetchedAttribute(emp, "startTime"); |
334 |
assertNotFetchedAttribute(emp, "startTime"); |
320 |
assertNotFetchedAttribute(emp, "endTime"); |
335 |
assertNotFetchedAttribute(emp, "endTime"); |
321 |
if (emp.getPeriod() != null) { |
336 |
if (emp.getPeriod() != null) { |
322 |
assertFetchedAttribute(emp.getPeriod(), "startDate"); |
337 |
assertFetchedAttribute(emp.getPeriod(), "startDate"); |
323 |
assertFetchedAttribute(emp.getPeriod(), "endDate"); |
338 |
assertFetchedAttribute(emp.getPeriod(), "endDate"); |
324 |
} |
339 |
} |
325 |
|
340 |
|
326 |
// Check Relationships |
341 |
// Check Relationships |
327 |
assertNotFetchedAttribute(emp, "address"); |
342 |
assertNotFetchedAttribute(emp, "address"); |
328 |
assertNotFetchedAttribute(emp, "manager"); |
343 |
assertNotFetchedAttribute(emp, "manager"); |
329 |
assertNotFetchedAttribute(emp, "phoneNumbers"); |
344 |
assertNotFetchedAttribute(emp, "phoneNumbers"); |
330 |
assertNotFetchedAttribute(emp, "projects"); |
345 |
assertNotFetchedAttribute(emp, "projects"); |
331 |
|
346 |
|
332 |
emp.getSalary(); |
347 |
emp.getSalary(); |
333 |
|
348 |
|
334 |
assertFetchedAttribute(emp, "salary"); |
349 |
assertFetchedAttribute(emp, "salary"); |
335 |
|
350 |
|
336 |
assertEquals(3, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
351 |
assertEquals(3, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
337 |
assertNoFetchGroup(emp); |
352 |
assertNoFetchGroup(emp); |
338 |
|
353 |
|
339 |
emp.getAddress(); |
354 |
emp.getAddress(); |
340 |
|
355 |
|
341 |
assertEquals(4, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
356 |
assertEquals(4, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
342 |
assertNoFetchGroup(emp.getAddress()); |
357 |
assertNoFetchGroup(emp.getAddress()); |
343 |
|
358 |
|
344 |
emp.getPhoneNumbers().size(); |
359 |
emp.getPhoneNumbers().size(); |
345 |
|
360 |
|
346 |
assertEquals(5, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
361 |
assertEquals(5, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
347 |
for (PhoneNumber phone : emp.getPhoneNumbers()) { |
362 |
for (PhoneNumber phone : emp.getPhoneNumbers()) { |
348 |
assertNoFetchGroup(phone); |
363 |
assertNoFetchGroup(phone); |
|
|
364 |
} |
365 |
} finally { |
366 |
if (isTransactionActive(em)){ |
367 |
rollbackTransaction(em); |
368 |
} |
369 |
closeEntityManager(em); |
349 |
} |
370 |
} |
350 |
} |
371 |
} |
351 |
|
372 |
|
Lines 355-413
Link Here
|
355 |
@Test |
376 |
@Test |
356 |
public void resultListEmptyFetchGroup() throws Exception { |
377 |
public void resultListEmptyFetchGroup() throws Exception { |
357 |
EntityManager em = createEntityManager(); |
378 |
EntityManager em = createEntityManager(); |
|
|
379 |
try { |
380 |
beginTransaction(em); |
358 |
|
381 |
|
359 |
Query query = em.createQuery("SELECT e FROM Employee e WHERE e.id = :ID"); |
382 |
Query query = em.createQuery("SELECT e FROM Employee e WHERE e.id = :ID"); |
360 |
query.setParameter("ID", minimumEmployeeId(em)); |
383 |
query.setParameter("ID", minimumEmployeeId(em)); |
361 |
FetchGroup emptyFG = new FetchGroup(); |
384 |
FetchGroup emptyFG = new FetchGroup(); |
362 |
query.setHint(QueryHints.FETCH_GROUP, emptyFG); |
385 |
query.setHint(QueryHints.FETCH_GROUP, emptyFG); |
363 |
|
386 |
|
364 |
List<Employee> emps = query.getResultList(); |
387 |
List<Employee> emps = query.getResultList(); |
365 |
|
388 |
|
366 |
assertNotNull(emps); |
389 |
assertNotNull(emps); |
367 |
assertEquals(1, emps.size()); |
390 |
assertEquals(1, emps.size()); |
368 |
|
391 |
|
369 |
Employee emp = emps.get(0); |
392 |
Employee emp = emps.get(0); |
370 |
|
393 |
|
371 |
assertEquals(2, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
394 |
assertEquals(2, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
372 |
assertFetched(emp, emptyFG); |
395 |
assertFetched(emp, emptyFG); |
373 |
|
396 |
|
374 |
// Check Basics |
397 |
// Check Basics |
375 |
assertFetchedAttribute(emp, "id"); |
398 |
assertFetchedAttribute(emp, "id"); |
376 |
assertFetchedAttribute(emp, "version"); |
399 |
assertFetchedAttribute(emp, "version"); |
377 |
assertNotFetchedAttribute(emp, "firstName"); |
400 |
assertNotFetchedAttribute(emp, "firstName"); |
378 |
assertNotFetchedAttribute(emp, "lastName"); |
401 |
assertNotFetchedAttribute(emp, "lastName"); |
379 |
assertNotFetchedAttribute(emp, "gender"); |
402 |
assertNotFetchedAttribute(emp, "gender"); |
380 |
assertNotFetchedAttribute(emp, "salary"); |
403 |
assertNotFetchedAttribute(emp, "salary"); |
381 |
assertNotFetchedAttribute(emp, "startTime"); |
404 |
assertNotFetchedAttribute(emp, "startTime"); |
382 |
assertNotFetchedAttribute(emp, "endTime"); |
405 |
assertNotFetchedAttribute(emp, "endTime"); |
383 |
assertEquals(2, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
406 |
assertEquals(2, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
384 |
if (emp.getPeriod() != null) { |
407 |
if (emp.getPeriod() != null) { |
385 |
assertFetchedAttribute(emp.getPeriod(), "startDate"); |
408 |
assertFetchedAttribute(emp.getPeriod(), "startDate"); |
386 |
assertFetchedAttribute(emp.getPeriod(), "endDate"); |
409 |
assertFetchedAttribute(emp.getPeriod(), "endDate"); |
387 |
} |
410 |
} |
388 |
|
411 |
|
389 |
// Check Relationships |
412 |
// Check Relationships |
390 |
assertNotFetchedAttribute(emp, "address"); |
413 |
assertNotFetchedAttribute(emp, "address"); |
391 |
assertNotFetchedAttribute(emp, "manager"); |
414 |
assertNotFetchedAttribute(emp, "manager"); |
392 |
assertNotFetchedAttribute(emp, "phoneNumbers"); |
415 |
assertNotFetchedAttribute(emp, "phoneNumbers"); |
393 |
assertNotFetchedAttribute(emp, "projects"); |
416 |
assertNotFetchedAttribute(emp, "projects"); |
394 |
|
417 |
|
395 |
assertEquals(3, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
418 |
assertEquals(3, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
396 |
|
419 |
|
397 |
emp.getSalary(); |
420 |
emp.getSalary(); |
398 |
|
421 |
|
399 |
assertFetchedAttribute(emp, "salary"); |
422 |
assertFetchedAttribute(emp, "salary"); |
400 |
assertNoFetchGroup(emp); |
423 |
assertNoFetchGroup(emp); |
401 |
assertEquals(3, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
424 |
assertEquals(3, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
402 |
|
425 |
|
403 |
assertNoFetchGroup(emp.getAddress()); |
426 |
assertNoFetchGroup(emp.getAddress()); |
404 |
|
427 |
|
405 |
assertEquals(4, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
428 |
assertEquals(4, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
406 |
|
429 |
|
407 |
for (PhoneNumber phone : emp.getPhoneNumbers()) { |
430 |
for (PhoneNumber phone : emp.getPhoneNumbers()) { |
408 |
assertNoFetchGroup(phone); |
431 |
assertNoFetchGroup(phone); |
|
|
432 |
} |
433 |
assertEquals(5, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
434 |
} finally { |
435 |
if (isTransactionActive(em)){ |
436 |
rollbackTransaction(em); |
437 |
} |
438 |
closeEntityManager(em); |
409 |
} |
439 |
} |
410 |
assertEquals(5, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
|
|
411 |
} |
440 |
} |
412 |
|
441 |
|
413 |
/** |
442 |
/** |
Lines 416-624
Link Here
|
416 |
@Test |
445 |
@Test |
417 |
public void resultListPeriodFetchGroup() throws Exception { |
446 |
public void resultListPeriodFetchGroup() throws Exception { |
418 |
EntityManager em = createEntityManager(); |
447 |
EntityManager em = createEntityManager(); |
|
|
448 |
try { |
449 |
beginTransaction(em); |
419 |
|
450 |
|
420 |
Query query = em.createQuery("SELECT e FROM Employee e WHERE e.id = :ID"); |
451 |
Query query = em.createQuery("SELECT e FROM Employee e WHERE e.id = :ID"); |
421 |
query.setParameter("ID", minimumEmployeeId(em)); |
452 |
query.setParameter("ID", minimumEmployeeId(em)); |
422 |
FetchGroup fg = new FetchGroup(); |
453 |
FetchGroup fg = new FetchGroup(); |
423 |
fg.addAttribute("period"); |
454 |
fg.addAttribute("period"); |
424 |
query.setHint(QueryHints.FETCH_GROUP, fg); |
455 |
query.setHint(QueryHints.FETCH_GROUP, fg); |
425 |
|
456 |
|
426 |
List<Employee> emps = query.getResultList(); |
457 |
List<Employee> emps = query.getResultList(); |
427 |
|
458 |
|
428 |
assertNotNull(emps); |
459 |
assertNotNull(emps); |
429 |
assertEquals(1, emps.size()); |
460 |
assertEquals(1, emps.size()); |
430 |
|
461 |
|
431 |
Employee emp = emps.get(0); |
462 |
Employee emp = emps.get(0); |
432 |
|
463 |
|
433 |
assertEquals(2, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
464 |
assertEquals(2, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
434 |
assertFetched(emp, fg); |
465 |
assertFetched(emp, fg); |
435 |
|
466 |
|
436 |
// Check Basics |
467 |
// Check Basics |
437 |
assertFetchedAttribute(emp, "id"); |
468 |
assertFetchedAttribute(emp, "id"); |
438 |
assertFetchedAttribute(emp, "version"); |
469 |
assertFetchedAttribute(emp, "version"); |
439 |
assertNotFetchedAttribute(emp, "firstName"); |
470 |
assertNotFetchedAttribute(emp, "firstName"); |
440 |
assertNotFetchedAttribute(emp, "lastName"); |
471 |
assertNotFetchedAttribute(emp, "lastName"); |
441 |
assertNotFetchedAttribute(emp, "gender"); |
472 |
assertNotFetchedAttribute(emp, "gender"); |
442 |
assertNotFetchedAttribute(emp, "salary"); |
473 |
assertNotFetchedAttribute(emp, "salary"); |
443 |
assertNotFetchedAttribute(emp, "startTime"); |
474 |
assertNotFetchedAttribute(emp, "startTime"); |
444 |
assertNotFetchedAttribute(emp, "endTime"); |
475 |
assertNotFetchedAttribute(emp, "endTime"); |
445 |
if (emp.getPeriod() != null) { |
476 |
if (emp.getPeriod() != null) { |
446 |
assertFetchedAttribute(emp.getPeriod(), "startDate"); |
477 |
assertFetchedAttribute(emp.getPeriod(), "startDate"); |
447 |
assertFetchedAttribute(emp.getPeriod(), "endDate"); |
478 |
assertFetchedAttribute(emp.getPeriod(), "endDate"); |
448 |
} |
479 |
} |
449 |
|
480 |
|
450 |
// Check Relationships |
481 |
// Check Relationships |
451 |
assertNotFetchedAttribute(emp, "address"); |
482 |
assertNotFetchedAttribute(emp, "address"); |
452 |
assertNotFetchedAttribute(emp, "manager"); |
483 |
assertNotFetchedAttribute(emp, "manager"); |
453 |
assertNotFetchedAttribute(emp, "phoneNumbers"); |
484 |
assertNotFetchedAttribute(emp, "phoneNumbers"); |
454 |
assertNotFetchedAttribute(emp, "projects"); |
485 |
assertNotFetchedAttribute(emp, "projects"); |
455 |
|
486 |
|
456 |
assertEquals(2, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
487 |
assertEquals(2, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
457 |
|
488 |
|
458 |
emp.getSalary(); |
489 |
emp.getSalary(); |
459 |
|
490 |
|
460 |
assertFetchedAttribute(emp, "salary"); |
491 |
assertFetchedAttribute(emp, "salary"); |
461 |
assertNoFetchGroup(emp); |
492 |
assertNoFetchGroup(emp); |
462 |
|
493 |
|
463 |
assertEquals(3, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
494 |
assertEquals(3, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
464 |
|
495 |
|
465 |
assertNoFetchGroup(emp.getAddress()); |
496 |
assertNoFetchGroup(emp.getAddress()); |
466 |
|
497 |
|
467 |
assertEquals(4, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
498 |
assertEquals(4, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
468 |
|
499 |
|
469 |
for (PhoneNumber phone : emp.getPhoneNumbers()) { |
500 |
for (PhoneNumber phone : emp.getPhoneNumbers()) { |
470 |
assertNoFetchGroup(phone); |
501 |
assertNoFetchGroup(phone); |
|
|
502 |
} |
503 |
assertEquals(5, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
504 |
} finally { |
505 |
if (isTransactionActive(em)){ |
506 |
rollbackTransaction(em); |
507 |
} |
508 |
closeEntityManager(em); |
471 |
} |
509 |
} |
472 |
assertEquals(5, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
|
|
473 |
} |
510 |
} |
474 |
|
511 |
|
475 |
@Test |
512 |
@Test |
476 |
public void managerFetchGroup() throws Exception { |
513 |
public void managerFetchGroup() throws Exception { |
477 |
EntityManager em = createEntityManager(); |
514 |
EntityManager em = createEntityManager(); |
|
|
515 |
try { |
516 |
beginTransaction(em); |
478 |
|
517 |
|
479 |
// Use q query since find will only use default fetch group |
518 |
// Use q query since find will only use default fetch group |
480 |
// Query query = em.createQuery("SELECT e FROM Employee e WHERE e.id = :ID"); |
519 |
//Query query = em.createQuery("SELECT e FROM Employee e WHERE e.id = :ID"); |
481 |
// query.setParameter("ID", minimumEmployeeId(em)); |
520 |
//query.setParameter("ID", minimumEmployeeId(em)); |
482 |
|
521 |
|
483 |
// Complex where clause used to avoid triggering employees and their departments: |
522 |
// Complex where clause used to avoid triggering employees and their departments: |
484 |
// Don't include employees who are managers themselves - otherwise if first selected as employee, then as e.manager the full read will be triggered; |
523 |
// Don't include employees who are managers themselves - otherwise if first selected as employee, then as e.manager the full read will be triggered; |
485 |
// Don't include managers with departments - because there is no fetch group on e.manager its (non-null) department will trigger an extra sql |
524 |
// Don't include managers with departments - because there is no fetch group on e.manager its (non-null) department will trigger an extra sql |
486 |
Query query = em.createQuery("SELECT e FROM Employee e WHERE e.manager IS NOT NULL AND NOT EXISTS(SELECT e2 FROM Employee e2 WHERE e2.manager = e) AND e.manager.department IS NULL"); |
525 |
Query query = em.createQuery("SELECT e FROM Employee e WHERE e.manager IS NOT NULL AND NOT EXISTS(SELECT e2 FROM Employee e2 WHERE e2.manager = e) AND e.manager.department IS NULL"); |
487 |
|
526 |
|
488 |
FetchGroup managerFG = new FetchGroup(); |
527 |
FetchGroup managerFG = new FetchGroup(); |
489 |
managerFG.addAttribute("manager"); |
528 |
managerFG.addAttribute("manager"); |
490 |
|
529 |
|
491 |
query.setHint(QueryHints.FETCH_GROUP, managerFG); |
530 |
query.setHint(QueryHints.FETCH_GROUP, managerFG); |
492 |
|
531 |
|
493 |
assertNotNull(getFetchGroup(query)); |
532 |
assertNotNull(getFetchGroup(query)); |
494 |
assertSame(managerFG, getFetchGroup(query)); |
533 |
assertSame(managerFG, getFetchGroup(query)); |
495 |
|
534 |
|
496 |
Employee emp = (Employee) query.getSingleResult(); |
535 |
Employee emp = (Employee) query.getSingleResult(); |
497 |
|
536 |
|
498 |
assertFetched(emp, managerFG); |
537 |
assertFetched(emp, managerFG); |
499 |
assertEquals(1, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
538 |
assertEquals(1, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
500 |
|
539 |
|
501 |
// manager (if not null) hasn't been instantiated yet. |
540 |
// manager (if not null) hasn't been instantiated yet. |
502 |
int nSqlToAdd = 0; |
541 |
int nSqlToAdd = 0; |
503 |
if (emp.getManager() != null) { |
542 |
if (emp.getManager() != null) { |
504 |
assertFetchedAttribute(emp, "manager"); |
543 |
assertFetchedAttribute(emp, "manager"); |
505 |
// additional sql to select the manager |
544 |
// additional sql to select the manager |
506 |
nSqlToAdd++; |
545 |
nSqlToAdd++; |
507 |
} |
546 |
} |
508 |
|
547 |
|
509 |
assertEquals(1 + nSqlToAdd, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
548 |
assertEquals(1 + nSqlToAdd, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
510 |
|
549 |
|
511 |
emp.getLastName(); |
550 |
emp.getLastName(); |
512 |
|
551 |
|
513 |
assertEquals(2 + nSqlToAdd, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
552 |
assertEquals(2 + nSqlToAdd, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
514 |
assertNoFetchGroup(emp); |
553 |
assertNoFetchGroup(emp); |
515 |
|
554 |
|
516 |
for (PhoneNumber phone : emp.getPhoneNumbers()) { |
555 |
for (PhoneNumber phone : emp.getPhoneNumbers()) { |
517 |
assertNoFetchGroup(phone); |
556 |
assertNoFetchGroup(phone); |
518 |
phone.getAreaCode(); |
557 |
phone.getAreaCode(); |
|
|
558 |
} |
559 |
|
560 |
assertEquals(3 + nSqlToAdd, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
561 |
} finally { |
562 |
if (isTransactionActive(em)){ |
563 |
rollbackTransaction(em); |
564 |
} |
565 |
closeEntityManager(em); |
519 |
} |
566 |
} |
520 |
|
|
|
521 |
assertEquals(3 + nSqlToAdd, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
522 |
} |
567 |
} |
523 |
|
568 |
|
524 |
@Test |
569 |
@Test |
525 |
public void managerFetchGroupWithJoinFetch() throws Exception { |
570 |
public void managerFetchGroupWithJoinFetch() throws Exception { |
526 |
EntityManager em = createEntityManager(); |
571 |
EntityManager em = createEntityManager(); |
|
|
572 |
try { |
573 |
beginTransaction(em); |
527 |
|
574 |
|
528 |
// int minId = minimumEmployeeId(em); |
575 |
//int minId = minimumEmployeeId(em); |
529 |
// assertEquals(1, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
576 |
//assertEquals(1, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
530 |
|
577 |
|
531 |
// Use q query since find will only use default fetch group |
578 |
// Use q query since find will only use default fetch group |
532 |
// Query query = em.createQuery("SELECT e FROM Employee e WHERE e.id = :ID"); |
579 |
//Query query = em.createQuery("SELECT e FROM Employee e WHERE e.id = :ID"); |
533 |
// query.setParameter("ID", minId); |
580 |
//query.setParameter("ID", minId); |
534 |
|
581 |
|
535 |
// Complex where clause used to avoid triggering employees and their departments: |
582 |
// Complex where clause used to avoid triggering employees and their departments: |
536 |
// Don't include employees who are managers themselves - otherwise if first selected as employee, then as e.manager the full read will be triggered; |
583 |
// Don't include employees who are managers themselves - otherwise if first selected as employee, then as e.manager the full read will be triggered; |
537 |
// Don't include managers with departments - because there is no fetch group on e.manager its (non-null) department will trigger an extra sql |
584 |
// Don't include managers with departments - because there is no fetch group on e.manager its (non-null) department will trigger an extra sql |
538 |
Query query = em.createQuery("SELECT e FROM Employee e WHERE e.manager IS NOT NULL AND NOT EXISTS(SELECT e2 FROM Employee e2 WHERE e2.manager = e) AND e.manager.department IS NULL"); |
585 |
Query query = em.createQuery("SELECT e FROM Employee e WHERE e.manager IS NOT NULL AND NOT EXISTS(SELECT e2 FROM Employee e2 WHERE e2.manager = e) AND e.manager.department IS NULL"); |
539 |
|
586 |
|
540 |
FetchGroup managerFG = new FetchGroup(); |
587 |
FetchGroup managerFG = new FetchGroup(); |
541 |
managerFG.addAttribute("manager"); |
588 |
managerFG.addAttribute("manager"); |
542 |
|
589 |
|
543 |
query.setHint(QueryHints.FETCH_GROUP, managerFG); |
590 |
query.setHint(QueryHints.FETCH_GROUP, managerFG); |
544 |
query.setHint(QueryHints.LEFT_FETCH, "e.manager"); |
591 |
query.setHint(QueryHints.LEFT_FETCH, "e.manager"); |
545 |
|
592 |
|
546 |
assertNotNull(getFetchGroup(query)); |
593 |
assertNotNull(getFetchGroup(query)); |
547 |
assertSame(managerFG, getFetchGroup(query)); |
594 |
assertSame(managerFG, getFetchGroup(query)); |
548 |
|
595 |
|
549 |
Employee emp = (Employee) query.getSingleResult(); |
596 |
Employee emp = (Employee) query.getSingleResult(); |
550 |
|
597 |
|
551 |
assertFetched(emp, managerFG); |
598 |
assertFetched(emp, managerFG); |
552 |
assertEquals(1, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
599 |
assertEquals(1, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
553 |
|
600 |
|
554 |
// manager has been already instantiated by the query. |
601 |
// manager has been already instantiated by the query. |
555 |
emp.getManager(); |
602 |
emp.getManager(); |
556 |
assertEquals(1, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
603 |
assertEquals(1, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
557 |
|
604 |
|
558 |
// instantiates the whiole object |
605 |
// instantiates the whiole object |
559 |
emp.getLastName(); |
606 |
emp.getLastName(); |
560 |
|
607 |
|
561 |
assertEquals(2, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
608 |
assertEquals(2, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
562 |
assertNoFetchGroup(emp); |
609 |
assertNoFetchGroup(emp); |
563 |
|
610 |
|
564 |
for (PhoneNumber phone : emp.getPhoneNumbers()) { |
611 |
for (PhoneNumber phone : emp.getPhoneNumbers()) { |
565 |
assertNoFetchGroup(phone); |
612 |
assertNoFetchGroup(phone); |
566 |
phone.getAreaCode(); |
613 |
phone.getAreaCode(); |
|
|
614 |
} |
615 |
|
616 |
assertEquals(3, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
617 |
} finally { |
618 |
if (isTransactionActive(em)){ |
619 |
rollbackTransaction(em); |
620 |
} |
621 |
closeEntityManager(em); |
567 |
} |
622 |
} |
568 |
|
|
|
569 |
assertEquals(3, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
570 |
} |
623 |
} |
571 |
|
624 |
|
572 |
@Test |
625 |
@Test |
573 |
public void employeeNamesFetchGroup() throws Exception { |
626 |
public void employeeNamesFetchGroup() throws Exception { |
574 |
EntityManager em = createEntityManager(); |
627 |
EntityManager em = createEntityManager(); |
|
|
628 |
try { |
629 |
beginTransaction(em); |
575 |
|
630 |
|
576 |
int minId = minimumEmployeeId(em); |
631 |
int minId = minimumEmployeeId(em); |
577 |
assertEquals(1, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
632 |
assertEquals(1, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
578 |
|
633 |
|
579 |
// Use q query since find will only use default fetch group |
634 |
// Use q query since find will only use default fetch group |
580 |
Query query = em.createQuery("SELECT e FROM Employee e WHERE e.id = :ID"); |
635 |
Query query = em.createQuery("SELECT e FROM Employee e WHERE e.id = :ID"); |
581 |
query.setParameter("ID", minId); |
636 |
query.setParameter("ID", minId); |
582 |
FetchGroup namesFG = new FetchGroup(); |
637 |
FetchGroup namesFG = new FetchGroup(); |
583 |
namesFG.addAttribute("firstName"); |
638 |
namesFG.addAttribute("firstName"); |
584 |
namesFG.addAttribute("lastName"); |
639 |
namesFG.addAttribute("lastName"); |
585 |
|
640 |
|
586 |
query.setHint(QueryHints.FETCH_GROUP, namesFG); |
641 |
query.setHint(QueryHints.FETCH_GROUP, namesFG); |
587 |
|
642 |
|
588 |
assertNotNull(getFetchGroup(query)); |
643 |
assertNotNull(getFetchGroup(query)); |
589 |
assertSame(namesFG, getFetchGroup(query)); |
644 |
assertSame(namesFG, getFetchGroup(query)); |
590 |
|
645 |
|
591 |
Employee emp = (Employee) query.getSingleResult(); |
646 |
Employee emp = (Employee) query.getSingleResult(); |
592 |
|
647 |
|
593 |
assertEquals(2, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
648 |
assertEquals(2, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
594 |
assertFetched(emp, namesFG); |
649 |
assertFetched(emp, namesFG); |
595 |
|
650 |
|
596 |
emp.getId(); |
651 |
emp.getId(); |
597 |
emp.getFirstName(); |
652 |
emp.getFirstName(); |
598 |
emp.getLastName(); |
653 |
emp.getLastName(); |
599 |
emp.getVersion(); |
654 |
emp.getVersion(); |
600 |
|
655 |
|
601 |
assertEquals(2, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
656 |
assertEquals(2, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
602 |
assertFetched(emp, namesFG); |
657 |
assertFetched(emp, namesFG); |
603 |
|
658 |
|
604 |
emp.getGender(); |
659 |
emp.getGender(); |
605 |
emp.getSalary(); |
660 |
emp.getSalary(); |
606 |
|
661 |
|
607 |
assertEquals(3, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
662 |
assertEquals(3, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
608 |
assertNoFetchGroup(emp); |
663 |
assertNoFetchGroup(emp); |
609 |
|
664 |
|
610 |
for (PhoneNumber phone : emp.getPhoneNumbers()) { |
665 |
for (PhoneNumber phone : emp.getPhoneNumbers()) { |
611 |
assertNoFetchGroup(phone); |
666 |
assertNoFetchGroup(phone); |
612 |
phone.getAreaCode(); |
667 |
phone.getAreaCode(); |
613 |
} |
668 |
} |
614 |
assertEquals(4, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
669 |
assertEquals(4, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
615 |
|
670 |
|
616 |
if (emp.getManager() != null) { |
671 |
if (emp.getManager() != null) { |
617 |
assertEquals(5, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
672 |
assertEquals(5, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
618 |
assertNoFetchGroup(emp.getManager()); |
673 |
assertNoFetchGroup(emp.getManager()); |
619 |
} else { |
674 |
} else { |
620 |
// If manager_id field is null then getManager() does not trigger an sql. |
675 |
// If manager_id field is null then getManager() does not trigger an sql. |
621 |
assertEquals(4, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
676 |
assertEquals(4, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
|
|
677 |
} |
678 |
} finally { |
679 |
if (isTransactionActive(em)){ |
680 |
rollbackTransaction(em); |
681 |
} |
682 |
closeEntityManager(em); |
622 |
} |
683 |
} |
623 |
} |
684 |
} |
624 |
|
685 |
|
Lines 657-685
Link Here
|
657 |
@Test |
718 |
@Test |
658 |
public void verifyUnfetchedAttributes() throws Exception { |
719 |
public void verifyUnfetchedAttributes() throws Exception { |
659 |
EntityManager em = createEntityManager(); |
720 |
EntityManager em = createEntityManager(); |
|
|
721 |
try { |
722 |
beginTransaction(em); |
660 |
|
723 |
|
661 |
TypedQuery<Employee> q = em.createQuery("SELECT e FROM Employee e WHERE e.id IN (SELECT MIN(p.id) FROM PhoneNumber p)", Employee.class); |
724 |
TypedQuery<Employee> q = em.createQuery("SELECT e FROM Employee e WHERE e.id IN (SELECT MIN(p.id) FROM PhoneNumber p)", Employee.class); |
662 |
FetchGroup fg = new FetchGroup("Employee.empty"); |
725 |
FetchGroup fg = new FetchGroup("Employee.empty"); |
663 |
q.setHint(QueryHints.FETCH_GROUP, fg); |
726 |
q.setHint(QueryHints.FETCH_GROUP, fg); |
664 |
Employee emp = q.getSingleResult(); |
727 |
Employee emp = q.getSingleResult(); |
665 |
|
728 |
|
666 |
assertNotNull(emp); |
729 |
assertNotNull(emp); |
667 |
assertEquals(1, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
730 |
assertEquals(1, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
668 |
|
731 |
|
669 |
// This check using the mapping returns a default (empty) IndirectList |
732 |
// This check using the mapping returns a default (empty) IndirectList |
670 |
/* OneToManyMapping phoneMapping = (OneToManyMapping) employeeDescriptor.getMappingForAttributeName("phoneNumbers"); |
733 |
/*OneToManyMapping phoneMapping = (OneToManyMapping) employeeDescriptor.getMappingForAttributeName("phoneNumbers"); |
671 |
IndirectList phones = (IndirectList) phoneMapping.getAttributeValueFromObject(emp); |
734 |
IndirectList phones = (IndirectList) phoneMapping.getAttributeValueFromObject(emp); |
672 |
assertNotNull(phones); |
735 |
assertNotNull(phones); |
673 |
assertTrue(phones.isInstantiated()); |
736 |
assertTrue(phones.isInstantiated()); |
674 |
assertEquals(0, phones.size()); |
737 |
assertEquals(0, phones.size()); |
675 |
assertEquals(1, getQuerySQLTracker(em).getTotalSQLSELECTCalls());*/ |
738 |
assertEquals(1, getQuerySQLTracker(em).getTotalSQLSELECTCalls());*/ |
676 |
|
739 |
|
677 |
IndirectList phonesIL = (IndirectList) emp.getPhoneNumbers(); |
740 |
IndirectList phonesIL = (IndirectList) emp.getPhoneNumbers(); |
678 |
assertFalse(phonesIL.isInstantiated()); |
741 |
assertFalse(phonesIL.isInstantiated()); |
679 |
assertEquals(2, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
742 |
assertEquals(2, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
680 |
|
743 |
|
681 |
assertTrue(emp.getPhoneNumbers().size() > 0); |
744 |
assertTrue(emp.getPhoneNumbers().size() > 0); |
682 |
assertEquals(3, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
745 |
assertEquals(3, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
|
|
746 |
} finally { |
747 |
if (isTransactionActive(em)){ |
748 |
rollbackTransaction(em); |
749 |
} |
750 |
closeEntityManager(em); |
751 |
} |
683 |
} |
752 |
} |
684 |
|
753 |
|
685 |
@Test |
754 |
@Test |
Lines 807-813
Link Here
|
807 |
em.clear(); |
876 |
em.clear(); |
808 |
HashMap hints = new HashMap(2); |
877 |
HashMap hints = new HashMap(2); |
809 |
hints.put(QueryHints.CACHE_USAGE, CacheUsage.CheckCacheOnly); |
878 |
hints.put(QueryHints.CACHE_USAGE, CacheUsage.CheckCacheOnly); |
810 |
// hints.put(QueryHints.FETCH_GROUP, fetchGroup); |
879 |
//hints.put(QueryHints.FETCH_GROUP, fetchGroup); |
811 |
Employee empShared = em.find(Employee.class, id, hints); |
880 |
Employee empShared = em.find(Employee.class, id, hints); |
812 |
assertEquals("newFirstName", empShared.getFirstName()); |
881 |
assertEquals("newFirstName", empShared.getFirstName()); |
813 |
assertEquals("newLastName", empShared.getLastName()); |
882 |
assertEquals("newLastName", empShared.getLastName()); |
Lines 855-861
Link Here
|
855 |
closeEntityManager(em); |
924 |
closeEntityManager(em); |
856 |
} |
925 |
} |
857 |
} |
926 |
} |
858 |
/* public void simpleSerializeAndMerge() throws Exception { |
927 |
/*public void simpleSerializeAndMerge() throws Exception { |
859 |
EntityManager em = createEntityManager(); |
928 |
EntityManager em = createEntityManager(); |
860 |
int id = minimumEmployeeId(em); |
929 |
int id = minimumEmployeeId(em); |
861 |
// save the original Employee for clean up |
930 |
// save the original Employee for clean up |
Lines 934-1053
Link Here
|
934 |
public void partialMerge() throws Exception { |
1003 |
public void partialMerge() throws Exception { |
935 |
EntityManager em = createEntityManager(); |
1004 |
EntityManager em = createEntityManager(); |
936 |
// Search for an Employee with an Address and Phone Numbers |
1005 |
// Search for an Employee with an Address and Phone Numbers |
937 |
TypedQuery<Employee> query = em.createQuery("SELECT e FROM Employee e WHERE e.address IS NOT NULL AND e.id IN (SELECT MIN(p.id) FROM PhoneNumber p)", Employee.class); |
1006 |
try { |
938 |
|
1007 |
beginTransaction(em); |
939 |
// Load only its names and phone Numbers |
1008 |
TypedQuery<Employee> query = em.createQuery("SELECT e FROM Employee e WHERE e.address IS NOT NULL AND e.id IN (SELECT MIN(p.id) FROM PhoneNumber p)", Employee.class); |
940 |
FetchGroup fetchGroup = new FetchGroup(); |
1009 |
|
941 |
fetchGroup.addAttribute("firstName"); |
1010 |
// Load only its names and phone Numbers |
942 |
fetchGroup.addAttribute("lastName"); |
1011 |
FetchGroup fetchGroup = new FetchGroup(); |
943 |
FetchGroup phonesFG = phoneDescriptor.getFetchGroupManager().createFullFetchGroup(); |
1012 |
fetchGroup.addAttribute("firstName"); |
944 |
// that ensures the owner is not instantiated |
1013 |
fetchGroup.addAttribute("lastName"); |
945 |
phonesFG.addAttribute("owner.id"); |
1014 |
FetchGroup phonesFG = phoneDescriptor.getFetchGroupManager().createFullFetchGroup(); |
946 |
phonesFG.removeAttribute("status"); |
1015 |
// that ensures the owner is not instantiated |
947 |
phonesFG.setShouldLoad(true); |
1016 |
phonesFG.addAttribute("owner.id"); |
948 |
fetchGroup.addAttribute("phoneNumbers", phonesFG); |
1017 |
phonesFG.removeAttribute("status"); |
949 |
|
1018 |
phonesFG.setShouldLoad(true); |
950 |
// Make sure the FetchGroup also forces the relationships to be loaded |
1019 |
fetchGroup.addAttribute("phoneNumbers", phonesFG); |
951 |
fetchGroup.setShouldLoad(true); |
1020 |
|
952 |
query.setHint(QueryHints.FETCH_GROUP, fetchGroup); |
1021 |
// Make sure the FetchGroup also forces the relationships to be loaded |
953 |
|
1022 |
fetchGroup.setShouldLoad(true); |
954 |
Employee emp = query.getSingleResult(); |
1023 |
query.setHint(QueryHints.FETCH_GROUP, fetchGroup); |
955 |
|
1024 |
|
956 |
// Detach Employee through Serialization |
1025 |
Employee emp = query.getSingleResult(); |
957 |
Employee detachedEmp = (Employee) SerializationHelper.clone(emp); |
1026 |
|
958 |
// Modify the detached Employee inverting the names, adding a phone number, and setting the salary |
1027 |
// Detach Employee through Serialization |
959 |
detachedEmp.setFirstName(emp.getLastName()); |
1028 |
Employee detachedEmp = (Employee)clone(emp); |
960 |
detachedEmp.setLastName(emp.getFirstName()); |
1029 |
|
961 |
detachedEmp.addPhoneNumber(new PhoneNumber("TEST", "999", "999999")); |
1030 |
// Modify the detached Employee inverting the names, adding a phone number, and setting the salary |
962 |
// NOte that salary was not part of the original FetchGroupdetachedEmp.setSalary(1); |
1031 |
detachedEmp.setFirstName(emp.getLastName()); |
963 |
detachedEmp.setSalary(1); |
1032 |
detachedEmp.setLastName(emp.getFirstName()); |
964 |
|
1033 |
detachedEmp.addPhoneNumber(new PhoneNumber("TEST", "999", "999999")); |
965 |
beginTransaction(em); |
1034 |
// NOte that salary was not part of the original FetchGroupdetachedEmp.setSalary(1); |
966 |
// Merge the detached employee |
1035 |
detachedEmp.setSalary(1); |
967 |
em.merge(detachedEmp); |
1036 |
|
968 |
// Flush the changes to the database |
1037 |
// Merge the detached employee |
969 |
em.flush(); |
1038 |
em.merge(detachedEmp); |
970 |
rollbackTransaction(em); |
1039 |
// Flush the changes to the database |
|
|
1040 |
em.flush(); |
1041 |
} finally { |
1042 |
rollbackTransaction(em); |
1043 |
closeEntityManager(em); |
1044 |
} |
971 |
} |
1045 |
} |
972 |
|
1046 |
|
973 |
public void copyGroupMerge() { |
1047 |
public void copyGroupMerge() { |
974 |
// Search for an Employee with an Address and Phone Numbers |
1048 |
// Search for an Employee with an Address and Phone Numbers |
975 |
EntityManager em = createEntityManager(); |
1049 |
EntityManager em = createEntityManager(); |
976 |
TypedQuery<Employee> query = em.createQuery("SELECT e FROM Employee e WHERE e.id IN (SELECT MIN(ee.id) FROM Employee ee)", Employee.class); |
1050 |
try { |
977 |
Employee emp = query.getSingleResult(); |
1051 |
beginTransaction(em); |
978 |
assertEquals(1, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
1052 |
TypedQuery<Employee> query = em.createQuery("SELECT e FROM Employee e WHERE e.id IN (SELECT MIN(ee.id) FROM Employee ee)", Employee.class); |
979 |
System.out.println(">>> Employee retrieved"); |
1053 |
Employee emp = query.getSingleResult(); |
980 |
|
1054 |
assertEquals(1, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
981 |
// Copy only its names and phone Numbers |
1055 |
System.out.println(">>> Employee retrieved"); |
982 |
AttributeGroup group = new CopyGroup(); |
1056 |
|
983 |
group.addAttribute("firstName"); |
1057 |
// Copy only its names and phone Numbers |
984 |
group.addAttribute("lastName"); |
1058 |
AttributeGroup group = new CopyGroup(); |
985 |
group.addAttribute("address"); |
1059 |
group.addAttribute("firstName"); |
986 |
|
1060 |
group.addAttribute("lastName"); |
987 |
Employee empCopy = (Employee) em.unwrap(JpaEntityManager.class).copy(emp, group); |
1061 |
group.addAttribute("address"); |
988 |
assertEquals(2, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
1062 |
|
989 |
System.out.println(">>> Employee copied"); |
1063 |
Employee empCopy = (Employee) em.unwrap(JpaEntityManager.class).copy(emp, group); |
990 |
|
1064 |
assertEquals(2, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
991 |
// Modify the detached Employee inverting the names, adding a phone number, and setting the salary |
1065 |
System.out.println(">>> Employee copied"); |
992 |
empCopy.setFirstName(emp.getLastName()); |
1066 |
|
993 |
empCopy.setLastName(emp.getFirstName()); |
1067 |
// Modify the detached Employee inverting the names, adding a phone number, and setting the salary |
994 |
|
1068 |
empCopy.setFirstName(emp.getLastName()); |
995 |
// Note that salary was not part of the original FetchGroup |
1069 |
empCopy.setLastName(emp.getFirstName()); |
996 |
//empCopy.setSalary(1); |
1070 |
|
997 |
|
1071 |
// Note that salary was not part of the original FetchGroup |
998 |
beginTransaction(em); |
1072 |
//empCopy.setSalary(1); |
999 |
// Merge the detached employee |
1073 |
|
1000 |
em.merge(empCopy); |
1074 |
// Merge the detached employee |
1001 |
System.out.println(">>> Sparse merge complete"); |
1075 |
em.merge(empCopy); |
1002 |
|
1076 |
System.out.println(">>> Sparse merge complete"); |
1003 |
// Flush the changes to the database |
1077 |
|
1004 |
em.flush(); |
1078 |
// Flush the changes to the database |
1005 |
System.out.println(">>> Flush complete"); |
1079 |
em.flush(); |
1006 |
|
1080 |
System.out.println(">>> Flush complete"); |
1007 |
rollbackTransaction(em); |
1081 |
} finally { |
|
|
1082 |
rollbackTransaction(em); |
1083 |
closeEntityManager(em); |
1084 |
} |
1008 |
} |
1085 |
} |
1009 |
|
1086 |
|
1010 |
public void copyGroupMerge2() { |
1087 |
public void copyGroupMerge2() { |
1011 |
// Search for an Employee with an Address and Phone Numbers |
1088 |
// Search for an Employee with an Address and Phone Numbers |
1012 |
EntityManager em = createEntityManager(); |
1089 |
EntityManager em = createEntityManager(); |
1013 |
TypedQuery<Employee> query = em.createQuery("SELECT e FROM Employee e", Employee.class); |
1090 |
try { |
1014 |
query.setHint(QueryHints.BATCH, "e.address"); |
1091 |
beginTransaction(em); |
1015 |
List<Employee> employees = query.getResultList(); |
1092 |
TypedQuery<Employee> query = em.createQuery("SELECT e FROM Employee e", Employee.class); |
1016 |
assertEquals(1, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
1093 |
query.setHint(QueryHints.BATCH, "e.address"); |
1017 |
System.out.println(">>> Employees retrieved"); |
1094 |
List<Employee> employees = query.getResultList(); |
1018 |
|
1095 |
assertEquals(1, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
1019 |
// Copy only its names and phone Numbers |
1096 |
System.out.println(">>> Employees retrieved"); |
1020 |
AttributeGroup group = new CopyGroup(); |
|
|
1021 |
group.addAttribute("firstName"); |
1022 |
group.addAttribute("lastName"); |
1023 |
group.addAttribute("address"); |
1024 |
|
1025 |
List<Employee> employeesCopy = (List<Employee>) em.unwrap(JpaEntityManager.class).copy(employees, group); |
1026 |
assertEquals(2, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
1027 |
System.out.println(">>> Employees copied"); |
1028 |
|
1029 |
beginTransaction(em); |
1030 |
for(Employee empCopy : employeesCopy) { |
1031 |
// Modify the detached Employee inverting the names, adding a phone number, and setting the salary |
1032 |
String firstName = empCopy.getFirstName(); |
1033 |
String lastName = empCopy.getLastName(); |
1034 |
empCopy.setFirstName(lastName); |
1035 |
empCopy.setLastName(firstName); |
1036 |
|
1037 |
// Note that salary was not part of the original FetchGroup |
1038 |
//empCopy.setSalary(1); |
1039 |
|
1097 |
|
1040 |
// Merge the detached employee |
1098 |
// Copy only its names and phone Numbers |
1041 |
em.merge(empCopy); |
1099 |
AttributeGroup group = new CopyGroup(); |
|
|
1100 |
group.addAttribute("firstName"); |
1101 |
group.addAttribute("lastName"); |
1102 |
group.addAttribute("address"); |
1103 |
|
1104 |
List<Employee> employeesCopy = (List<Employee>) em.unwrap(JpaEntityManager.class).copy(employees, group); |
1105 |
assertEquals(2, getQuerySQLTracker(em).getTotalSQLSELECTCalls()); |
1106 |
System.out.println(">>> Employees copied"); |
1107 |
|
1108 |
for(Employee empCopy : employeesCopy) { |
1109 |
// Modify the detached Employee inverting the names, adding a phone number, and setting the salary |
1110 |
String firstName = empCopy.getFirstName(); |
1111 |
String lastName = empCopy.getLastName(); |
1112 |
empCopy.setFirstName(lastName); |
1113 |
empCopy.setLastName(firstName); |
1114 |
|
1115 |
// Note that salary was not part of the original FetchGroup |
1116 |
//empCopy.setSalary(1); |
1117 |
|
1118 |
// Merge the detached employee |
1119 |
em.merge(empCopy); |
1120 |
} |
1121 |
System.out.println(">>> Sparse merge complete"); |
1122 |
|
1123 |
// Flush the changes to the database |
1124 |
em.flush(); |
1125 |
System.out.println(">>> Flush complete"); |
1126 |
|
1127 |
} finally { |
1128 |
rollbackTransaction(em); |
1129 |
closeEntityManager(em); |
1042 |
} |
1130 |
} |
1043 |
System.out.println(">>> Sparse merge complete"); |
|
|
1044 |
|
1045 |
// Flush the changes to the database |
1046 |
em.flush(); |
1047 |
System.out.println(">>> Flush complete"); |
1048 |
|
1049 |
rollbackTransaction(em); |
1050 |
} |
1131 |
} |
|
|
1132 |
|
1051 |
|
1133 |
|
1052 |
@Test |
1134 |
@Test |
1053 |
public void copyWithPk() { |
1135 |
public void copyWithPk() { |
Lines 1069-1075
Link Here
|
1069 |
copyWithOrWithoutPk(true, true); |
1151 |
copyWithOrWithoutPk(true, true); |
1070 |
} |
1152 |
} |
1071 |
|
1153 |
|
1072 |
void copyWithOrWithoutPk(boolean noPk, boolean useFullGroup) { |
1154 |
void copyWithOrWithoutPk(boolean noPk, boolean useFullGroup) { |
1073 |
CopyGroup group = new CopyGroup(); |
1155 |
CopyGroup group = new CopyGroup(); |
1074 |
if(noPk) { |
1156 |
if(noPk) { |
1075 |
// setShouldResetPrimaryKey set to true means that: |
1157 |
// setShouldResetPrimaryKey set to true means that: |
Lines 1140-1150
Link Here
|
1140 |
} |
1222 |
} |
1141 |
|
1223 |
|
1142 |
EntityManager em = createEntityManager(); |
1224 |
EntityManager em = createEntityManager(); |
1143 |
Employee emp = minimumEmployee(em); |
|
|
1144 |
Employee empCopy = (Employee) em.unwrap(JpaEntityManager.class).copy(emp, group); |
1145 |
|
1146 |
beginTransaction(em); |
1147 |
try { |
1225 |
try { |
|
|
1226 |
beginTransaction(em); |
1227 |
Employee emp = minimumEmployee(em); |
1228 |
Employee empCopy = (Employee) em.unwrap(JpaEntityManager.class).copy(emp, group); |
1229 |
|
1148 |
if(noPk) { |
1230 |
if(noPk) { |
1149 |
assertNoFetchGroup(empCopy); |
1231 |
assertNoFetchGroup(empCopy); |
1150 |
assertNoFetchGroup(empCopy.getAddress()); |
1232 |
assertNoFetchGroup(empCopy.getAddress()); |
Lines 1235-1388
Link Here
|
1235 |
|
1317 |
|
1236 |
void copyCascade(int cascadeDepth) { |
1318 |
void copyCascade(int cascadeDepth) { |
1237 |
EntityManager em = createEntityManager(); |
1319 |
EntityManager em = createEntityManager(); |
1238 |
Query query = em.createQuery("SELECT e FROM Employee e"); |
1320 |
try { |
1239 |
List<Employee> employees = query.getResultList(); |
1321 |
beginTransaction(em); |
|
|
1322 |
Query query = em.createQuery("SELECT e FROM Employee e"); |
1323 |
List<Employee> employees = query.getResultList(); |
1240 |
|
1324 |
|
1241 |
CopyGroup group = new CopyGroup(); |
1325 |
CopyGroup group = new CopyGroup(); |
1242 |
if(cascadeDepth == CopyGroup.NO_CASCADE) { |
1326 |
if(cascadeDepth == CopyGroup.NO_CASCADE) { |
1243 |
group.dontCascade(); |
1327 |
group.dontCascade(); |
1244 |
} else if(cascadeDepth == CopyGroup.CASCADE_PRIVATE_PARTS) { |
1328 |
} else if(cascadeDepth == CopyGroup.CASCADE_PRIVATE_PARTS) { |
1245 |
// default cascade depth setting |
1329 |
// default cascade depth setting |
1246 |
group.cascadePrivateParts(); |
1330 |
group.cascadePrivateParts(); |
1247 |
} else if(cascadeDepth == CopyGroup.CASCADE_ALL_PARTS) { |
1331 |
} else if(cascadeDepth == CopyGroup.CASCADE_ALL_PARTS) { |
1248 |
group.cascadeAllParts(); |
1332 |
group.cascadeAllParts(); |
1249 |
} else { |
1333 |
} else { |
1250 |
fail("Invalid cascadeDepth = " + cascadeDepth); |
1334 |
fail("Invalid cascadeDepth = " + cascadeDepth); |
1251 |
} |
|
|
1252 |
group.setShouldResetPrimaryKey(true); |
1253 |
|
1254 |
List<Employee> employeesCopy; |
1255 |
if(cascadeDepth == CopyGroup.NO_CASCADE || cascadeDepth == CopyGroup.CASCADE_PRIVATE_PARTS) { |
1256 |
// In this case the objects should be copied one by one - each one using a new CopyGroup. |
1257 |
// That ensures most referenced object are original ones (not copies) - |
1258 |
// the only exception is privately owned objects in CASCADE_PRIVATE_PARTS case. |
1259 |
employeesCopy = new ArrayList(employees.size()); |
1260 |
for(Employee emp : employees) { |
1261 |
CopyGroup groupClone = group.clone(); |
1262 |
employeesCopy.add((Employee)em.unwrap(JpaEntityManager.class).copy(emp, groupClone)); |
1263 |
} |
1335 |
} |
1264 |
} else { |
1336 |
group.setShouldResetPrimaryKey(true); |
1265 |
// cascadeDepth == CopyGroup.CASCADE_ALL_PARTS |
1337 |
|
1266 |
// In this case all objects should be copied using a single CopyGroup. |
1338 |
List<Employee> employeesCopy; |
1267 |
// That ensures identities of the copies: |
1339 |
if(cascadeDepth == CopyGroup.NO_CASCADE || cascadeDepth == CopyGroup.CASCADE_PRIVATE_PARTS) { |
1268 |
// for instance if several employees referenced the same project, |
1340 |
// In this case the objects should be copied one by one - each one using a new CopyGroup. |
1269 |
// then all copies of these employees will reference the single copy of the project. |
1341 |
// That ensures most referenced object are original ones (not copies) - |
1270 |
employeesCopy = (List)em.unwrap(JpaEntityManager.class).copy(employees, group); |
1342 |
// the only exception is privately owned objects in CASCADE_PRIVATE_PARTS case. |
1271 |
} |
1343 |
employeesCopy = new ArrayList(employees.size()); |
1272 |
|
1344 |
for(Employee emp : employees) { |
1273 |
// IdentityHashSets will be used to verify copy identities |
1345 |
CopyGroup groupClone = group.clone(); |
1274 |
IdentityHashSet originalEmployees = new IdentityHashSet(); |
1346 |
employeesCopy.add((Employee)em.unwrap(JpaEntityManager.class).copy(emp, groupClone)); |
1275 |
IdentityHashSet copyEmployees = new IdentityHashSet(); |
1347 |
} |
1276 |
IdentityHashSet originalAddresses = new IdentityHashSet(); |
|
|
1277 |
IdentityHashSet copyAddresses = new IdentityHashSet(); |
1278 |
IdentityHashSet originalProjects = new IdentityHashSet(); |
1279 |
IdentityHashSet copyProjects = new IdentityHashSet(); |
1280 |
IdentityHashSet originalPhones = new IdentityHashSet(); |
1281 |
IdentityHashSet copyPhones = new IdentityHashSet(); |
1282 |
|
1283 |
int size = employees.size(); |
1284 |
for(int i=0; i < size; i++) { |
1285 |
Employee emp = employees.get(i); |
1286 |
Employee empCopy = employeesCopy.get(i); |
1287 |
if(cascadeDepth == CopyGroup.CASCADE_ALL_PARTS) { |
1288 |
originalEmployees.add(emp); |
1289 |
copyEmployees.add(empCopy); |
1290 |
} else { |
1348 |
} else { |
1291 |
// cascadeDepth == CopyGroup.NO_CASCADE || cascadeDepth == CopyGroup.CASCADE_PRIVATE_PARTS |
1349 |
// cascadeDepth == CopyGroup.CASCADE_ALL_PARTS |
1292 |
// In this case all Employees referenced by empCopyes are originals (manager and managed employees). |
1350 |
// In this case all objects should be copied using a single CopyGroup. |
1293 |
// Therefore if we add here each emp and empCopy to originalEmployees and copyEmployees respectively |
1351 |
// That ensures identities of the copies: |
1294 |
// then copyEmployees will always contain all original managers and managed + plus all copies. |
1352 |
// for instance if several employees referenced the same project, |
1295 |
// Therefore in this case originalEmployees and copyEmployees will contain only references (managers and managed employees). |
1353 |
// then all copies of these employees will reference the single copy of the project. |
|
|
1354 |
employeesCopy = (List)em.unwrap(JpaEntityManager.class).copy(employees, group); |
1296 |
} |
1355 |
} |
|
|
1356 |
|
1357 |
// IdentityHashSets will be used to verify copy identities |
1358 |
IdentityHashSet originalEmployees = new IdentityHashSet(); |
1359 |
IdentityHashSet copyEmployees = new IdentityHashSet(); |
1360 |
IdentityHashSet originalAddresses = new IdentityHashSet(); |
1361 |
IdentityHashSet copyAddresses = new IdentityHashSet(); |
1362 |
IdentityHashSet originalProjects = new IdentityHashSet(); |
1363 |
IdentityHashSet copyProjects = new IdentityHashSet(); |
1364 |
IdentityHashSet originalPhones = new IdentityHashSet(); |
1365 |
IdentityHashSet copyPhones = new IdentityHashSet(); |
1366 |
|
1367 |
int size = employees.size(); |
1368 |
for(int i=0; i < size; i++) { |
1369 |
Employee emp = employees.get(i); |
1370 |
Employee empCopy = employeesCopy.get(i); |
1371 |
if(cascadeDepth == CopyGroup.CASCADE_ALL_PARTS) { |
1372 |
originalEmployees.add(emp); |
1373 |
copyEmployees.add(empCopy); |
1374 |
} else { |
1375 |
// cascadeDepth == CopyGroup.NO_CASCADE || cascadeDepth == CopyGroup.CASCADE_PRIVATE_PARTS |
1376 |
// In this case all Employees referenced by empCopyes are originals (manager and managed employees). |
1377 |
// Therefore if we add here each emp and empCopy to originalEmployees and copyEmployees respectively |
1378 |
// then copyEmployees will always contain all original managers and managed + plus all copies. |
1379 |
// Therefore in this case originalEmployees and copyEmployees will contain only references (managers and managed employees). |
1380 |
} |
1297 |
|
1381 |
|
1298 |
if(emp.getAddress() == null) { |
1382 |
if(emp.getAddress() == null) { |
1299 |
assertTrue("emp.getAddress() == null, but empCopy.getAddress() != null", empCopy.getAddress() == null); |
1383 |
assertTrue("emp.getAddress() == null, but empCopy.getAddress() != null", empCopy.getAddress() == null); |
1300 |
} else { |
|
|
1301 |
originalAddresses.add(emp.getAddress()); |
1302 |
copyAddresses.add(empCopy.getAddress()); |
1303 |
if(cascadeDepth == CopyGroup.NO_CASCADE || cascadeDepth == CopyGroup.CASCADE_PRIVATE_PARTS) { |
1304 |
assertTrue("address has been copied", emp.getAddress() == empCopy.getAddress()); |
1305 |
} else { |
1384 |
} else { |
1306 |
// cascadeDepth == CopyGroup.CASCADE_ALL_PARTS |
1385 |
originalAddresses.add(emp.getAddress()); |
1307 |
assertFalse("address has not been copied", emp.getAddress() == empCopy.getAddress()); |
1386 |
copyAddresses.add(empCopy.getAddress()); |
|
|
1387 |
if(cascadeDepth == CopyGroup.NO_CASCADE || cascadeDepth == CopyGroup.CASCADE_PRIVATE_PARTS) { |
1388 |
assertTrue("address has been copied", emp.getAddress() == empCopy.getAddress()); |
1389 |
} else { |
1390 |
// cascadeDepth == CopyGroup.CASCADE_ALL_PARTS |
1391 |
assertFalse("address has not been copied", emp.getAddress() == empCopy.getAddress()); |
1392 |
} |
1308 |
} |
1393 |
} |
1309 |
} |
|
|
1310 |
|
1394 |
|
1311 |
boolean same; |
1395 |
boolean same; |
1312 |
for(Project project : emp.getProjects()) { |
1396 |
for(Project project : emp.getProjects()) { |
1313 |
originalProjects.add(project); |
1397 |
originalProjects.add(project); |
1314 |
same = false; |
1398 |
same = false; |
1315 |
for(Project projectCopy : empCopy.getProjects()) { |
1399 |
for(Project projectCopy : empCopy.getProjects()) { |
1316 |
copyProjects.add(projectCopy); |
1400 |
copyProjects.add(projectCopy); |
1317 |
if(!same && project == projectCopy) { |
1401 |
if(!same && project == projectCopy) { |
1318 |
same = true; |
1402 |
same = true; |
|
|
1403 |
} |
1319 |
} |
1404 |
} |
|
|
1405 |
if(cascadeDepth == CopyGroup.NO_CASCADE || cascadeDepth == CopyGroup.CASCADE_PRIVATE_PARTS) { |
1406 |
assertTrue("project has been copied", same); |
1407 |
} else { |
1408 |
// cascadeDepth == CopyGroup.CASCADE_ALL_PARTS |
1409 |
assertFalse("project has not been copied", same); |
1410 |
} |
1320 |
} |
1411 |
} |
1321 |
if(cascadeDepth == CopyGroup.NO_CASCADE || cascadeDepth == CopyGroup.CASCADE_PRIVATE_PARTS) { |
|
|
1322 |
assertTrue("project has been copied", same); |
1323 |
} else { |
1324 |
// cascadeDepth == CopyGroup.CASCADE_ALL_PARTS |
1325 |
assertFalse("project has not been copied", same); |
1326 |
} |
1327 |
} |
1328 |
|
1412 |
|
1329 |
for(Employee managedEmp : emp.getManagedEmployees()) { |
1413 |
for(Employee managedEmp : emp.getManagedEmployees()) { |
1330 |
originalEmployees.add(managedEmp); |
1414 |
originalEmployees.add(managedEmp); |
1331 |
same = false; |
1415 |
same = false; |
1332 |
for(Employee managedEmpCopy : empCopy.getManagedEmployees()) { |
1416 |
for(Employee managedEmpCopy : empCopy.getManagedEmployees()) { |
1333 |
copyEmployees.add(managedEmpCopy); |
1417 |
copyEmployees.add(managedEmpCopy); |
1334 |
if(!same && managedEmp == managedEmpCopy) { |
1418 |
if(!same && managedEmp == managedEmpCopy) { |
1335 |
same = true; |
1419 |
same = true; |
|
|
1420 |
} |
1336 |
} |
1421 |
} |
|
|
1422 |
if(cascadeDepth == CopyGroup.NO_CASCADE || cascadeDepth == CopyGroup.CASCADE_PRIVATE_PARTS) { |
1423 |
assertTrue("managedEmployee has been copied", same); |
1424 |
} else { |
1425 |
// cascadeDepth == CopyGroup.CASCADE_ALL_PARTS |
1426 |
assertFalse("managedEmployee has not been copied", same); |
1427 |
} |
1337 |
} |
1428 |
} |
1338 |
if(cascadeDepth == CopyGroup.NO_CASCADE || cascadeDepth == CopyGroup.CASCADE_PRIVATE_PARTS) { |
1429 |
|
1339 |
assertTrue("managedEmployee has been copied", same); |
1430 |
if(emp.getManager() == null) { |
|
|
1431 |
assertTrue("emp.getManager() == null, but empCopy.getManager() != null", empCopy.getManager() == null); |
1340 |
} else { |
1432 |
} else { |
1341 |
// cascadeDepth == CopyGroup.CASCADE_ALL_PARTS |
1433 |
originalEmployees.add(emp.getManager()); |
1342 |
assertFalse("managedEmployee has not been copied", same); |
1434 |
copyEmployees.add(empCopy.getManager()); |
|
|
1435 |
if(cascadeDepth == CopyGroup.NO_CASCADE || cascadeDepth == CopyGroup.CASCADE_PRIVATE_PARTS) { |
1436 |
assertTrue("manager has been copied", emp.getManager() == empCopy.getManager()); |
1437 |
} else { |
1438 |
// cascadeDepth == CopyGroup.CASCADE_ALL_PARTS |
1439 |
assertFalse("manager has not been copied", emp.getManager() == empCopy.getManager()); |
1440 |
} |
1343 |
} |
1441 |
} |
1344 |
} |
|
|
1345 |
|
1346 |
if(emp.getManager() == null) { |
1347 |
assertTrue("emp.getManager() == null, but empCopy.getManager() != null", empCopy.getManager() == null); |
1348 |
} else { |
1349 |
originalEmployees.add(emp.getManager()); |
1350 |
copyEmployees.add(empCopy.getManager()); |
1351 |
if(cascadeDepth == CopyGroup.NO_CASCADE || cascadeDepth == CopyGroup.CASCADE_PRIVATE_PARTS) { |
1352 |
assertTrue("manager has been copied", emp.getManager() == empCopy.getManager()); |
1353 |
} else { |
1354 |
// cascadeDepth == CopyGroup.CASCADE_ALL_PARTS |
1355 |
assertFalse("manager has not been copied", emp.getManager() == empCopy.getManager()); |
1356 |
} |
1357 |
} |
1358 |
|
1442 |
|
1359 |
// phoneNumbers is privately owned |
1443 |
// phoneNumbers is privately owned |
1360 |
for(PhoneNumber phone : emp.getPhoneNumbers()) { |
1444 |
for(PhoneNumber phone : emp.getPhoneNumbers()) { |
1361 |
originalPhones.add(phone); |
1445 |
originalPhones.add(phone); |
1362 |
same = false; |
1446 |
same = false; |
1363 |
for(PhoneNumber phoneCopy : empCopy.getPhoneNumbers()) { |
1447 |
for(PhoneNumber phoneCopy : empCopy.getPhoneNumbers()) { |
1364 |
copyPhones.add(phoneCopy); |
1448 |
copyPhones.add(phoneCopy); |
1365 |
if(!same && phone == phoneCopy) { |
1449 |
if(!same && phone == phoneCopy) { |
1366 |
same = true; |
1450 |
same = true; |
|
|
1451 |
} |
1367 |
} |
1452 |
} |
|
|
1453 |
if(cascadeDepth == CopyGroup.NO_CASCADE) { |
1454 |
assertTrue("phone has been copied", same); |
1455 |
} else { |
1456 |
// cascadeDepth == CopyGroup.CASCADE_ALL_PARTS || cascadeDepth == CopyGroup.CASCADE_PRIVATE_PARTS |
1457 |
assertFalse("phone has not been copied", same); |
1458 |
} |
1368 |
} |
1459 |
} |
1369 |
if(cascadeDepth == CopyGroup.NO_CASCADE) { |
|
|
1370 |
assertTrue("phone has been copied", same); |
1371 |
} else { |
1372 |
// cascadeDepth == CopyGroup.CASCADE_ALL_PARTS || cascadeDepth == CopyGroup.CASCADE_PRIVATE_PARTS |
1373 |
assertFalse("phone has not been copied", same); |
1374 |
} |
1375 |
} |
1460 |
} |
|
|
1461 |
|
1462 |
assertTrue("copyEmployees.size() == " + copyEmployees.size() + "; was expected " + originalEmployees.size(), originalEmployees.size() == copyEmployees.size()); |
1463 |
assertTrue("copyAddresses.size() == " + copyAddresses.size() + "; was expected " + originalAddresses.size(), originalAddresses.size() == copyAddresses.size()); |
1464 |
assertTrue("copyProjects.size() == " + copyProjects.size() + "; was expected " + originalProjects.size(), originalProjects.size() == copyProjects.size()); |
1465 |
assertTrue("copyPhones.size() == " + copyPhones.size() + "; was expected " + originalPhones.size(), originalPhones.size() == copyPhones.size()); |
1466 |
} finally { |
1467 |
if(isTransactionActive(em)) { |
1468 |
rollbackTransaction(em); |
1469 |
} |
1376 |
} |
1470 |
} |
1377 |
|
|
|
1378 |
assertTrue("copyEmployees.size() == " + copyEmployees.size() + "; was expected " + originalEmployees.size(), originalEmployees.size() == copyEmployees.size()); |
1379 |
assertTrue("copyAddresses.size() == " + copyAddresses.size() + "; was expected " + originalAddresses.size(), originalAddresses.size() == copyAddresses.size()); |
1380 |
assertTrue("copyProjects.size() == " + copyProjects.size() + "; was expected " + originalProjects.size(), originalProjects.size() == copyProjects.size()); |
1381 |
assertTrue("copyPhones.size() == " + copyPhones.size() + "; was expected " + originalPhones.size(), originalPhones.size() == copyPhones.size()); |
1382 |
} |
1471 |
} |
1383 |
|
1472 |
|
1384 |
private <T> T serialize(Serializable entity) throws IOException, ClassNotFoundException { |
1473 |
private <T> T serialize(Serializable entity) throws IOException, ClassNotFoundException { |
1385 |
byte[] bytes = SerializationHelper.serialize(entity); |
1474 |
byte[] bytes = SerializationHelper.serialize(entity); |
1386 |
return (T) SerializationHelper.deserialize(bytes); |
1475 |
ObjectInputStream inStream = new ObjectInputStream(new ByteArrayInputStream(bytes)); |
|
|
1476 |
return (T) inStream.readObject(); |
1387 |
} |
1477 |
} |
|
|
1478 |
|
1479 |
private Object clone(Serializable object) throws IOException, ClassNotFoundException { |
1480 |
byte[] bytes = SerializationHelper.serialize(object); |
1481 |
ObjectInputStream inStream = new ObjectInputStream(new ByteArrayInputStream(bytes)); |
1482 |
return inStream.readObject(); |
1483 |
} |
1388 |
} |
1484 |
} |