Source code: org/hibernate/test/legacy/FumTest.java
1 //$Id: FumTest.java,v 1.10 2005/02/27 14:43:58 oneovthafew Exp $
2 package org.hibernate.test.legacy;
3
4 import java.io.ByteArrayInputStream;
5 import java.io.ByteArrayOutputStream;
6 import java.io.IOException;
7 import java.io.ObjectInputStream;
8 import java.io.ObjectOutputStream;
9 import java.io.Serializable;
10 import java.sql.SQLException;
11 import java.util.ArrayList;
12 import java.util.Date;
13 import java.util.GregorianCalendar;
14 import java.util.HashSet;
15 import java.util.Iterator;
16 import java.util.LinkedList;
17 import java.util.List;
18 import java.util.Map;
19 import java.util.Properties;
20 import java.util.Set;
21
22 import junit.framework.Test;
23 import junit.framework.TestSuite;
24 import junit.textui.TestRunner;
25
26 import org.hibernate.Criteria;
27 import org.hibernate.FetchMode;
28 import org.hibernate.FlushMode;
29 import org.hibernate.Hibernate;
30 import org.hibernate.HibernateException;
31 import org.hibernate.LockMode;
32 import org.hibernate.Query;
33 import org.hibernate.Transaction;
34 import org.hibernate.classic.Session;
35 import org.hibernate.criterion.Expression;
36 import org.hibernate.criterion.MatchMode;
37 import org.hibernate.dialect.HSQLDialect;
38 import org.hibernate.dialect.MckoiDialect;
39 import org.hibernate.dialect.MySQLDialect;
40 import org.hibernate.dialect.PointbaseDialect;
41 import org.hibernate.dialect.TimesTenDialect;
42 import org.hibernate.test.TestCase;
43 import org.hibernate.transform.AliasToBeanResultTransformer;
44 import org.hibernate.type.DateType;
45 import org.hibernate.type.EntityType;
46 import org.hibernate.type.StringType;
47 import org.hibernate.type.Type;
48
49 public class FumTest extends TestCase {
50
51 private static short fumKeyShort = 1;
52
53 public FumTest(String arg) {
54 super(arg);
55 }
56
57 public void testQuery() {
58 Session s = openSession();
59 Transaction t = s.beginTransaction();
60 s.createQuery("from Fum fum where fum.fo.id.string = 'x'").list();
61 t.commit();
62 s.close();
63 }
64
65 public void testCriteriaCollection() throws Exception {
66 if ( getDialect() instanceof HSQLDialect ) return;
67 Session s = openSession();
68 Fum fum = new Fum( fumKey("fum") );
69 fum.setFum("a value");
70 fum.getMapComponent().getFummap().put("self", fum);
71 fum.getMapComponent().getStringmap().put("string", "a staring");
72 fum.getMapComponent().getStringmap().put("string2", "a notha staring");
73 fum.getMapComponent().setCount(1);
74 s.save(fum);
75 s.flush();
76 s.connection().commit();
77 s.close();
78 s = openSession();
79 Fum b = (Fum) s.createCriteria(Fum.class).add(
80 Expression.in("fum", new String[] { "a value", "no value" } )
81 )
82 .uniqueResult();
83 //assertTrue( Hibernate.isInitialized( b.getMapComponent().getFummap() ) );
84 assertTrue( Hibernate.isInitialized( b.getMapComponent().getStringmap() ) );
85 assertTrue( b.getMapComponent().getFummap().size()==1 );
86 assertTrue( b.getMapComponent().getStringmap().size()==2 );
87 s.delete(b);
88 s.flush();
89 s.connection().commit();
90 s.close();
91 }
92
93 public void testCriteria() throws Exception {
94 Session s = openSession();
95 Fum fum = new Fum( fumKey("fum") );
96 fum.setFo( new Fum( fumKey("fo") ) );
97 fum.setFum("fo fee fi");
98 fum.getFo().setFum("stuff");
99 Fum fr = new Fum( fumKey("fr") );
100 fr.setFum("goo");
101 Fum fr2 = new Fum( fumKey("fr2") );
102 fr2.setFum("soo");
103 fum.setFriends( new HashSet() );
104 fum.getFriends().add(fr);
105 fum.getFriends().add(fr2);
106 s.save(fr);
107 s.save(fr2);
108 s.save( fum.getFo() );
109 s.save(fum);
110
111 Criteria base = s.createCriteria(Fum.class)
112 .add( Expression.like("fum", "f", MatchMode.START) );
113 base.createCriteria("fo")
114 .add( Expression.isNotNull("fum") );
115 base.createCriteria("friends")
116 .add( Expression.like("fum", "g%") );
117 List list = base.list();
118 assertTrue( list.size()==1 && list.get(0)==fum );
119
120 base = s.createCriteria(Fum.class)
121 .add( Expression.like("fum", "f%") )
122 .setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
123 base.createCriteria("fo", "fo")
124 .add( Expression.isNotNull("fum") );
125 base.createCriteria("friends", "fum")
126 .add( Expression.like("fum", "g", MatchMode.START) );
127 Map map = (Map) base.uniqueResult();
128
129 assertTrue(
130 map.get("this")==fum &&
131 map.get("fo")==fum.getFo() &&
132 fum.getFriends().contains( map.get("fum") ) &&
133 map.size()==3
134 );
135
136 base = s.createCriteria(Fum.class)
137 .add( Expression.like("fum", "f%") )
138 .setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP)
139 .setFetchMode("friends", FetchMode.EAGER);
140 base.createCriteria("fo", "fo")
141 .add( Expression.eq( "fum", fum.getFo().getFum() ) );
142 map = (Map) base.list().get(0);
143
144 assertTrue(
145 map.get("this")==fum &&
146 map.get("fo")==fum.getFo() &&
147 map.size()==2
148 );
149
150 list = s.createCriteria(Fum.class)
151 .createAlias("friends", "fr")
152 .createAlias("fo", "fo")
153 .add( Expression.like("fum", "f%") )
154 .add( Expression.isNotNull("fo") )
155 .add( Expression.isNotNull("fo.fum") )
156 .add( Expression.like("fr.fum", "g%") )
157 .add( Expression.eqProperty("fr.id.short", "id.short") )
158 .list();
159 assertTrue( list.size()==1 && list.get(0)==fum );
160 s.flush();
161 s.connection().commit();
162 s.close();
163
164 s = openSession();
165 base = s.createCriteria(Fum.class)
166 .add( Expression.like("fum", "f%") );
167 base.createCriteria("fo")
168 .add( Expression.isNotNull("fum") );
169 base.createCriteria("friends")
170 .add( Expression.like("fum", "g%") );
171 fum = (Fum) base.list().get(0);
172 assertTrue( fum.getFriends().size()==2 );
173 s.delete(fum);
174 s.delete( fum.getFo() );
175 Iterator iter = fum.getFriends().iterator();
176 while ( iter.hasNext() ) s.delete( iter.next() );
177 s.flush();
178 s.connection().commit();
179 s.close();
180 }
181
182 static public class ABean {
183 public Fum fum;
184 public Fum fo;
185 public Fum getFo() {
186 return fo;
187 }
188 public void setFo(Fum fo) {
189 this.fo = fo;
190 }
191 public Fum getFum() {
192 return fum;
193 }
194 public void setFum(Fum fum) {
195 this.fum = fum;
196 }
197 }
198
199 public void testBeanResultTransformer() throws HibernateException, SQLException {
200
201 Session s = openSession();
202 Transaction transaction = s.beginTransaction();
203 Fum fum = new Fum( fumKey("fum") );
204 fum.setFo( new Fum( fumKey("fo") ) );
205 fum.setFum("fo fee fi");
206 fum.getFo().setFum("stuff");
207 Fum fr = new Fum( fumKey("fr") );
208 fr.setFum("goo");
209 Fum fr2 = new Fum( fumKey("fr2") );
210 fr2.setFum("soo");
211 fum.setFriends( new HashSet() );
212 fum.getFriends().add(fr);
213 fum.getFriends().add(fr2);
214 s.save(fr);
215 s.save(fr2);
216 s.save( fum.getFo() );
217 s.save(fum);
218
219 Criteria test = s.createCriteria(Fum.class, "xam")
220 .createCriteria("fo", "fo")
221 .setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
222
223 Map fc = (Map) test.list().get(0);
224 assertNotNull(fc.get("xam"));
225
226 Criteria base = s.createCriteria(Fum.class, "fum")
227 .add( Expression.like("fum", "f%") )
228 .setResultTransformer(new AliasToBeanResultTransformer(ABean.class))
229 .setFetchMode("friends", FetchMode.JOIN);
230 base.createCriteria("fo", "fo")
231 .add( Expression.eq( "fum", fum.getFo().getFum() ) );
232 ABean map = (ABean) base.list().get(0);
233
234 assertTrue(
235 map.getFum()==fum &&
236 map.getFo()==fum.getFo() );
237
238 s.delete(fr);
239 s.delete(fr2);
240 s.delete(fum);
241 s.delete(fum.getFo());
242 s.flush();
243 transaction.commit();
244 s.close();
245
246 }
247
248
249 public void testListIdentifiers() throws Exception {
250 Session s = openSession();
251 Fum fum = new Fum( fumKey("fum") );
252 fum.setFum("fo fee fi");
253 s.save(fum);
254 fum = new Fum( fumKey("fi") );
255 fum.setFum("fee fi fo");
256 s.save(fum);
257 List list = s.find("select fum.id from Fum as fum where not fum.fum='FRIEND'");
258 assertTrue( "list identifiers", list.size()==2);
259 Iterator iter = s.iterate("select fum.id from Fum fum where not fum.fum='FRIEND'");
260 int i=0;
261 while ( iter.hasNext() ) {
262 assertTrue( "iterate identifiers", iter.next() instanceof FumCompositeID);
263 i++;
264 }
265 assertTrue(i==2);
266
267 s.delete( s.load(Fum.class, (Serializable) list.get(0) ) );
268 s.delete( s.load(Fum.class, (Serializable) list.get(1) ) );
269 s.flush();
270 s.connection().commit();
271 s.close();
272 }
273
274
275 public FumCompositeID fumKey(String str) {
276
277 return fumKey(str,false);
278 }
279
280 private FumCompositeID fumKey(String str, boolean aCompositeQueryTest) {
281 FumCompositeID id = new FumCompositeID();
282 if ( getDialect() instanceof MckoiDialect ) {
283 GregorianCalendar now = new GregorianCalendar();
284 GregorianCalendar cal = new GregorianCalendar(
285 now.get(java.util.Calendar.YEAR),
286 now.get(java.util.Calendar.MONTH),
287 now.get(java.util.Calendar.DATE)
288 );
289 id.setDate( cal.getTime() );
290 }
291 else {
292 id.setDate( new Date() );
293 }
294 id.setString( new String(str) );
295
296 if (aCompositeQueryTest) {
297 id.setShort( fumKeyShort++ );
298 }
299 else {
300 id.setShort( (short) 12 );
301 }
302
303 return id;
304 }
305
306 public void testCompositeID() throws Exception {
307 if ( getDialect() instanceof HSQLDialect ) return;
308 Session s = openSession();
309 Fum fum = new Fum( fumKey("fum") );
310 fum.setFum("fee fi fo");
311 s.save(fum);
312 assertTrue( "load by composite key", fum==s.load( Fum.class, fumKey("fum") ) );
313 s.flush();
314 s.connection().commit();
315 s.close();
316
317 s = openSession();
318 fum = (Fum) s.load( Fum.class, fumKey("fum"), LockMode.UPGRADE );
319 assertTrue( "load by composite key", fum!=null );
320
321 Fum fum2 = new Fum( fumKey("fi") );
322 fum2.setFum("fee fo fi");
323 fum.setFo(fum2);
324 s.save(fum2);
325 assertTrue(
326 "find composite keyed objects",
327 s.find("from Fum fum where not fum.fum='FRIEND'").size()==2
328 );
329 assertTrue(
330 "find composite keyed object",
331 s.find("select fum from Fum fum where fum.fum='fee fi fo'").get(0)==fum
332 );
333 fum.setFo(null);
334 s.flush();
335 s.connection().commit();
336 s.close();
337
338 s = openSession();
339 Iterator iter = s.iterate("from Fum fum where not fum.fum='FRIEND'");
340 int i = 0;
341 while ( iter.hasNext() ) {
342 fum = (Fum) iter.next();
343 //iter.remove();
344 s.delete(fum);
345 i++;
346 }
347 assertTrue( "iterate on composite key", i==2 );
348 s.flush();
349 s.connection().commit();
350 s.close();
351 }
352
353 public void testCompositeIDOneToOne() throws Exception {
354 if ( getDialect() instanceof HSQLDialect ) return;
355 Session s = openSession();
356 Fum fum = new Fum( fumKey("fum") );
357 fum.setFum("fee fi fo");
358 //s.save(fum);
359 Fumm fumm = new Fumm();
360 fumm.setFum(fum);
361 s.save(fumm);
362 s.flush();
363 s.connection().commit();
364 s.close();
365 s = openSession();
366 fumm = (Fumm) s.load( Fumm.class, fumKey("fum") );
367 //s.delete( fumm.getFum() );
368 s.delete(fumm);
369 s.flush();
370 s.connection().commit();
371 s.close();
372 }
373
374 public void testCompositeIDQuery() throws Exception {
375 if ( getDialect() instanceof HSQLDialect ) return;
376 Session s = openSession();
377 Fum fee = new Fum( fumKey("fee",true) );
378 fee.setFum("fee");
379 s.save(fee);
380 Fum fi = new Fum( fumKey("fi",true) );
381 fi.setFum("fi");
382 short fiShort = fi.getId().getShort();
383 s.save(fi);
384 Fum fo = new Fum( fumKey("fo",true) );
385 fo.setFum("fo");
386 s.save(fo);
387 Fum fum = new Fum( fumKey("fum",true) );
388 fum.setFum("fum");
389 s.save(fum);
390 s.flush();
391 s.connection().commit();
392 s.close();
393
394 s = openSession();
395 // Try to find the Fum object "fo" that we inserted searching by the string in the id
396 List vList = s.find("from Fum fum where fum.id.string='fo'" );
397 assertTrue( "find by composite key query (find fo object)", vList.size() == 1 );
398 fum = (Fum)vList.get(0);
399 assertTrue( "find by composite key query (check fo object)", fum.getId().getString().equals("fo") );
400
401 // Try to find the Fum object "fi" that we inserted searching by the date in the id
402 vList = s.find("from Fum fum where fum.id.short = ?",new Short(fiShort),Hibernate.SHORT);
403 assertTrue( "find by composite key query (find fi object)", vList.size() == 1 );
404 fi = (Fum)vList.get(0);
405 assertTrue( "find by composite key query (check fi object)", fi.getId().getString().equals("fi") );
406
407 // Make sure we can return all of the objects by searching by the date id
408 assertTrue(
409 "find by composite key query with arguments",
410 s.find("from Fum fum where fum.id.date <= ? and not fum.fum='FRIEND'",new Date(),Hibernate.DATE).size()==4
411 );
412 s.flush();
413 s.connection().commit();
414 s.close();
415
416 s = openSession();
417 assertTrue(
418 s.iterate("select fum.id.short, fum.id.date, fum.id.string from Fum fum").hasNext()
419 );
420 assertTrue(
421 s.iterate("select fum.id from Fum fum").hasNext()
422 );
423 Query qu = s.createQuery("select fum.fum, fum , fum.fum, fum.id.date from Fum fum");
424 Type[] types = qu.getReturnTypes();
425 assertTrue(types.length==4);
426 for ( int k=0; k<types.length; k++) {
427 assertTrue( types[k]!=null );
428 }
429 assertTrue(types[0] instanceof StringType);
430 assertTrue(types[1] instanceof EntityType);
431 assertTrue(types[2] instanceof StringType);
432 assertTrue(types[3] instanceof DateType);
433 Iterator iter = qu.iterate();
434 int j = 0;
435 while ( iter.hasNext() ) {
436 j++;
437 assertTrue( ( (Object[]) iter.next() )[1] instanceof Fum );
438 }
439 assertTrue( "iterate on composite key", j==8 );
440
441 fum = (Fum) s.load( Fum.class, fum.getId() );
442 s.filter( fum.getQuxArray(), "where this.foo is null" );
443 s.filter( fum.getQuxArray(), "where this.foo.id = ?", "fooid", Hibernate.STRING );
444 Query f = s.createFilter( fum.getQuxArray(), "where this.foo.id = :fooId" );
445 f.setString("fooId", "abc");
446 assertFalse( f.iterate().hasNext() );
447
448 iter = s.iterate("from Fum fum where not fum.fum='FRIEND'");
449 int i = 0;
450 while ( iter.hasNext() ) {
451 fum = (Fum) iter.next();
452 //iter.remove();
453 s.delete(fum);
454 i++;
455 }
456 assertTrue( "iterate on composite key", i==4 );
457 s.flush();
458
459 s.iterate("from Fum fu, Fum fo where fu.fo.id.string = fo.id.string and fo.fum is not null");
460
461 s.find("from Fumm f1 inner join f1.fum f2");
462
463 s.connection().commit();
464 s.close();
465 }
466
467
468 public void testCompositeIDCollections() throws Exception {
469 if ( getDialect() instanceof HSQLDialect ) return;
470 Session s = openSession();
471 Fum fum1 = new Fum( fumKey("fum1") );
472 Fum fum2 = new Fum( fumKey("fum2") );
473 fum1.setFum("fee fo fi");
474 fum2.setFum("fee fo fi");
475 s.save(fum1);
476 s.save(fum2);
477 Qux q = new Qux();
478 s.save(q);
479 Set set = new HashSet();
480 List list = new ArrayList();
481 set.add(fum1); set.add(fum2);
482 list.add(fum1);
483 q.setFums(set);
484 q.setMoreFums(list);
485 fum1.setQuxArray( new Qux[] {q} );
486 s.flush();
487 s.connection().commit();
488 s.close();
489
490 s = openSession();
491 q = (Qux) s.load( Qux.class, q.getKey() );
492 assertTrue( "collection of fums", q.getFums().size()==2 );
493 assertTrue( "collection of fums", q.getMoreFums().size()==1 );
494 assertTrue( "unkeyed composite id collection", ( (Fum) q.getMoreFums().get(0) ).getQuxArray()[0]==q );
495 Iterator iter = q.getFums().iterator();
496 iter.hasNext();
497 Fum f = (Fum) iter.next();
498 s.delete(f);
499 iter.hasNext();
500 f = (Fum) iter.next();
501 s.delete(f);
502 s.delete(q);
503 s.flush();
504 s.connection().commit();
505 s.close();
506 }
507
508
509 public void testDeleteOwner() throws Exception {
510 Session s = openSession();
511 Qux q = new Qux();
512 s.save(q);
513 Fum f1 = new Fum( fumKey("f1") );
514 Fum f2 = new Fum( fumKey("f2") );
515 Set set = new HashSet();
516 set.add(f1);
517 set.add(f2);
518 List list = new LinkedList();
519 list.add(f1);
520 list.add(f2);
521 f1.setFum("f1");
522 f2.setFum("f2");
523 q.setFums(set);
524 q.setMoreFums(list);
525 s.save(f1);
526 s.save(f2);
527 s.flush();
528 s.connection().commit();
529 s.close();
530
531 s = openSession();
532 q = (Qux) s.load( Qux.class, q.getKey(), LockMode.UPGRADE );
533 s.lock( q, LockMode.UPGRADE );
534 s.delete(q);
535 s.flush();
536 s.connection().commit();
537 s.close();
538
539 s = openSession();
540 list = s.find("from Fum fum where not fum.fum='FRIEND'");
541 assertTrue( "deleted owner", list.size()==2 );
542 s.lock( list.get(0), LockMode.UPGRADE );
543 s.lock( list.get(1), LockMode.UPGRADE );
544 Iterator iter = list.iterator();
545 while ( iter.hasNext() ) {
546 s.delete( iter.next() );
547 }
548 s.flush();
549 s.connection().commit();
550 s.close();
551 }
552
553
554 public void testCompositeIDs() throws Exception {
555 Session s = openSession();
556 Fo fo = Fo.newFo();
557 Properties props = new Properties();
558 props.setProperty("foo", "bar");
559 props.setProperty("bar", "foo");
560 fo.setSerial(props);
561 fo.setBuf( "abcdefghij1`23%$*^*$*\n\t".getBytes() );
562 s.save( fo, fumKey("an instance of fo") );
563 s.flush();
564 props.setProperty("x", "y");
565 s.flush();
566 s.connection().commit();
567 s.close();
568
569 s = openSession();
570 fo = (Fo) s.load( Fo.class, fumKey("an instance of fo") );
571 props = (Properties) fo.getSerial();
572 assertTrue( props.getProperty("foo").equals("bar") );
573 //assertTrue( props.contains("x") );
574 assertTrue( props.getProperty("x").equals("y") );
575 assertTrue( fo.getBuf()[0]=='a' );
576 fo.getBuf()[1]=(byte)126;
577 s.flush();
578 s.connection().commit();
579 s.close();
580
581 s = openSession();
582 fo = (Fo) s.load( Fo.class, fumKey("an instance of fo") );
583 assertTrue( fo.getBuf()[1]==126 );
584 assertTrue(
585 s.iterate("from Fo fo where fo.id.string like 'an instance of fo'").next()==fo
586 );
587 s.delete(fo);
588 s.flush();
589 try {
590 s.save( Fo.newFo() );
591 assertTrue(false);
592 }
593 catch (Exception e) {
594 //System.out.println( e.getMessage() );
595 }
596 s.connection().commit();
597 s.close();
598 }
599
600 public void testKeyManyToOne() throws Exception {
601 Session s = openSession();
602 Inner sup = new Inner();
603 InnerKey sid = new InnerKey();
604 sup.setDudu("dudu");
605 sid.setAkey("a");
606 sid.setBkey("b");
607 sup.setId(sid);
608 Middle m = new Middle();
609 MiddleKey mid = new MiddleKey();
610 mid.setOne("one");
611 mid.setTwo("two");
612 mid.setSup(sup);
613 m.setId(mid);
614 m.setBla("bla");
615 Outer d = new Outer();
616 OuterKey did = new OuterKey();
617 did.setMaster(m);
618 did.setDetailId("detail");
619 d.setId(did);
620 d.setBubu("bubu");
621 s.save(sup);
622 s.save(m);
623 s.save(d);
624 s.flush();
625 s.connection().commit();
626 s.close();
627
628 s = openSession();
629 Inner in = (Inner) s.find("from Inner").get(0);
630 assertTrue( in.getMiddles().size()==1 );
631 s.flush();
632 s.connection().commit();
633 s.close();
634 s = openSession();
635 assertTrue( s.find("from Inner _inner join _inner.middles middle").size()==1 );
636 s.flush();
637 s.connection().commit();
638 s.close();
639
640 s = openSession();
641 d = (Outer) s.load(Outer.class, did);
642 assertTrue( d.getId().getMaster().getId().getSup().getDudu().equals("dudu") );
643 s.delete(d);
644 s.delete( d.getId().getMaster() );
645 s.save( d.getId().getMaster() );
646 s.save(d);
647 s.flush();
648 s.connection().commit();
649 s.close();
650
651 s = openSession();
652 d = (Outer) s.find("from Outer o where o.id.detailId = ?", d.getId().getDetailId(), Hibernate.STRING ).get(0);
653 s.find("from Outer o where o.id.master.id.sup.dudu is not null");
654 s.find("from Outer o where o.id.master.id.sup.id.akey is not null");
655 if ( !(getDialect() instanceof HSQLDialect) ) s.find("from Inner i where i.backOut.id.master.id.sup.id.akey = i.id.bkey");
656 List l = s.find("select o.id.master.id.sup.dudu from Outer o where o.id.master.id.sup.dudu is not null");
657 assertTrue(l.size()==1);
658 l = s.find("select o.id.master.id.sup.id.akey from Outer o where o.id.master.id.sup.id.akey is not null");
659 assertTrue(l.size()==1);
660 if ( !(getDialect() instanceof HSQLDialect) ) s.find("select i.backOut.id.master.id.sup.id.akey from Inner i where i.backOut.id.master.id.sup.id.akey = i.id.bkey");
661 s.find("from Outer o where o.id.master.bla = ''");
662 s.find("from Outer o where o.id.master.id.one = ''");
663 s.find("from Inner inn where inn.id.bkey is not null and inn.backOut.id.master.id.sup.id.akey > 'a'");
664 s.find("from Outer as o left join o.id.master m left join m.id.sup where o.bubu is not null");
665 s.find("from Outer as o left join o.id.master.id.sup s where o.bubu is not null");
666 s.find("from Outer as o left join o.id.master m left join o.id.master.id.sup s where o.bubu is not null");
667 s.delete(d);
668 s.delete( d.getId().getMaster() );
669 s.delete( d.getId().getMaster().getId().getSup() );
670 s.flush();
671 s.connection().commit();
672 s.close();
673 }
674
675 public void testCompositeKeyPathExpressions() throws Exception {
676 Session s = openSession();
677 s.find("select fum1.fo from Fum fum1 where fum1.fo.fum is not null");
678 s.find("from Fum fum1 where fum1.fo.fum is not null order by fum1.fo.fum");
679 if ( !(getDialect() instanceof MySQLDialect) && !(getDialect() instanceof HSQLDialect) && !(getDialect() instanceof MckoiDialect) && !(getDialect() instanceof PointbaseDialect) ) {
680 s.find("from Fum fum1 where exists elements(fum1.friends)");
681 if(!(getDialect() instanceof TimesTenDialect)) { // can't execute because TimesTen can't do subqueries combined with aggreations
682 s.find("from Fum fum1 where size(fum1.friends) = 0");
683 }
684 }
685 s.find("select elements(fum1.friends) from Fum fum1");
686 s.find("from Fum fum1, fr in elements( fum1.friends )");
687 s.connection().commit();
688 s.close();
689 }
690
691 public void testUnflushedSessionSerialization() throws Exception {
692
693 ///////////////////////////////////////////////////////////////////////////
694 // Test insertions across serializations
695 Session s = getSessions().openSession();
696 s.setFlushMode(FlushMode.NEVER);
697
698 Simple simple = new Simple();
699 simple.setAddress("123 Main St. Anytown USA");
700 simple.setCount(1);
701 simple.setDate( new Date() );
702 simple.setName("My UnflushedSessionSerialization Simple");
703 simple.setPay( new Float(5000) );
704 s.save( simple, new Long(10) );
705
706 // Now, try to serialize session without flushing...
707 s.disconnect();
708 Session s2 = spoofSerialization(s);
709 s.close();
710 s = s2;
711 s.reconnect();
712
713 simple = (Simple) s.load( Simple.class, new Long(10) );
714 Simple other = new Simple();
715 other.init();
716 s.save( other, new Long(11) );
717
718 simple.setOther(other);
719 s.flush();
720
721 s.connection().commit();
722 s.close();
723 Simple check = simple;
724
725 ///////////////////////////////////////////////////////////////////////////
726 // Test updates across serializations
727 s = getSessions().openSession();
728 s.setFlushMode(FlushMode.NEVER);
729
730 simple = (Simple) s.get( Simple.class, new Long(10) );
731 assertTrue("Not same parent instances", check.getName().equals( simple.getName() ) );
732 assertTrue("Not same child instances", check.getOther().getName().equals( other.getName() ) );
733
734 simple.setName("My updated name");
735
736 s.disconnect();
737 s2 = spoofSerialization(s);
738 s.close();
739 s = s2;
740 s.reconnect();
741 s.flush();
742
743 s.connection().commit();
744 s.close();
745 check = simple;
746
747 ///////////////////////////////////////////////////////////////////////////
748 // Test deletions across serializations
749 s = getSessions().openSession();
750 s.setFlushMode(FlushMode.NEVER);
751
752 simple = (Simple) s.get( Simple.class, new Long(10) );
753 assertTrue("Not same parent instances", check.getName().equals( simple.getName() ) );
754 assertTrue("Not same child instances", check.getOther().getName().equals( other.getName() ) );
755
756 // Now, lets delete across serialization...
757 s.delete(simple);
758
759 s.disconnect();
760 s2 = spoofSerialization(s);
761 s.close();
762 s = s2;
763 s.reconnect();
764 s.flush();
765
766 s.connection().commit();
767 s.close();
768
769 ///////////////////////////////////////////////////////////////////////////
770 // Test collection actions across serializations
771 s = getSessions().openSession();
772 s.setFlushMode(FlushMode.NEVER);
773
774 Fum fum = new Fum( fumKey("uss-fum") );
775 fum.setFo( new Fum( fumKey("uss-fo") ) );
776 fum.setFum("fo fee fi");
777 fum.getFo().setFum("stuff");
778 Fum fr = new Fum( fumKey("uss-fr") );
779 fr.setFum("goo");
780 Fum fr2 = new Fum( fumKey("uss-fr2") );
781 fr2.setFum("soo");
782 fum.setFriends( new HashSet() );
783 fum.getFriends().add(fr);
784 fum.getFriends().add(fr2);
785 s.save(fr);
786 s.save(fr2);
787 s.save( fum.getFo() );
788 s.save(fum);
789
790 s.disconnect();
791 s2 = spoofSerialization(s);
792 s.close();
793 s = s2;
794 s.reconnect();
795 s.flush();
796
797 s.connection().commit();
798 s.close();
799
800 s = getSessions().openSession();
801 s.setFlushMode(FlushMode.NEVER);
802 fum = (Fum) s.load( Fum.class, fum.getId() );
803
804 assertTrue("the Fum.friends did not get saved", fum.getFriends().size() == 2);
805
806 fum.setFriends(null);
807 s.disconnect();
808 s2 = spoofSerialization(s);
809 s.close();
810
811 s = s2;
812 s.reconnect();
813 s.flush();
814
815 s.connection().commit();
816 s.close();
817
818 s = getSessions().openSession();
819 s.setFlushMode(FlushMode.NEVER);
820 fum = (Fum) s.load( Fum.class, fum.getId() );
821 assertTrue("the Fum.friends is not empty", fum.getFriends() == null || fum.getFriends().size() == 0);
822 s.connection().commit();
823 s.close();
824 }
825
826 private Session spoofSerialization(Session session) throws IOException {
827 try {
828 // Serialize the incoming out to memory
829 ByteArrayOutputStream serBaOut = new ByteArrayOutputStream();
830 ObjectOutputStream serOut = new ObjectOutputStream(serBaOut);
831
832 serOut.writeObject(session);
833
834 // Now, re-constitute the model from memory
835 ByteArrayInputStream serBaIn =
836 new ByteArrayInputStream(serBaOut.toByteArray());
837 ObjectInputStream serIn = new ObjectInputStream(serBaIn);
838
839 Session outgoing = (Session) serIn.readObject();
840
841 return outgoing;
842 }
843 catch (ClassNotFoundException cnfe) {
844 throw new IOException("Unable to locate class on reconstruction");
845 }
846 }
847
848 public String[] getMappings() {
849 return new String[] {
850 "legacy/FooBar.hbm.xml",
851 "legacy/Baz.hbm.xml",
852 "legacy/Qux.hbm.xml",
853 "legacy/Glarch.hbm.xml",
854 "legacy/Fum.hbm.xml",
855 "legacy/Fumm.hbm.xml",
856 "legacy/Fo.hbm.xml",
857 "legacy/One.hbm.xml",
858 "legacy/Many.hbm.xml",
859 "legacy/Immutable.hbm.xml",
860 "legacy/Fee.hbm.xml",
861 "legacy/Vetoer.hbm.xml",
862 "legacy/Holder.hbm.xml",
863 "legacy/Location.hbm.xml",
864 "legacy/Stuff.hbm.xml",
865 "legacy/Container.hbm.xml",
866 "legacy/Simple.hbm.xml",
867 "legacy/Middle.hbm.xml"
868 };
869 }
870
871 public static Test suite() {
872 return new TestSuite(FumTest.class);
873 }
874 public static void main(String[] args) throws Exception {
875 TestRunner.run( suite() );
876 }
877
878 }
879
880
881
882
883
884
885