1 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().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 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 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); 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 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 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 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 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.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 } 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)) { 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 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 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 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 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 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 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 ByteArrayOutputStream serBaOut = new ByteArrayOutputStream (); 830 ObjectOutputStream serOut = new ObjectOutputStream (serBaOut); 831 832 serOut.writeObject(session); 833 834 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 886 | Popular Tags |