public void testJoinFetch() { Session s = openSession(); Transaction t = s.beginTransaction(); s.createQuery("delete from Bid").executeUpdate(); s.createQuery("delete from Comment").executeUpdate(); s.createQuery("delete from Item").executeUpdate(); t.commit(); s.close(); Category cat = new Category("Photography"); Item i = new Item(cat, "Camera"); Bid b = new Bid(i, 100.0f); new Bid(i, 105.0f); new Comment(i, "This looks like a really good deal"); new Comment(i, "Is it the latest version?"); new Comment(i, "<comment deleted>"); System.out.println(b.getTimestamp()); s = openSession(); t = s.beginTransaction(); s.persist(cat); s.persist(i); t.commit(); s.close(); getSessions().evict(Item.class); s = openSession(); t = s.beginTransaction(); i = (Item) s.get(Item.class, i.getId()); assertTrue(Hibernate.isInitialized(i.getBids())); assertEquals(i.getBids().size(), 2); assertTrue(Hibernate.isInitialized(i.getComments())); assertEquals(i.getComments().size(), 3); t.commit(); s.close(); getSessions().evict(Bid.class); s = openSession(); t = s.beginTransaction(); b = (Bid) s.get(Bid.class, b.getId()); assertTrue(Hibernate.isInitialized(b.getItem())); assertTrue(Hibernate.isInitialized(b.getItem().getComments())); assertEquals(b.getItem().getComments().size(), 3); System.out.println(b.getTimestamp()); t.commit(); s.close(); getSessions().evictCollection(Item.class.getName() + ".bids"); s = openSession(); t = s.beginTransaction(); i = (Item) s.createCriteria(Item.class) .setFetchMode("bids", FetchMode.SELECT) .setFetchMode("comments", FetchMode.SELECT) .uniqueResult(); assertFalse(Hibernate.isInitialized(i.getBids())); assertFalse(Hibernate.isInitialized(i.getComments())); b = (Bid) i.getBids().iterator().next(); assertTrue(Hibernate.isInitialized(b.getItem())); t.commit(); s.close(); s = openSession(); t = s.beginTransaction(); i = (Item) s.createQuery("from Item i left join fetch i.bids left join fetch i.comments") .uniqueResult(); assertTrue(Hibernate.isInitialized(i.getBids())); assertTrue(Hibernate.isInitialized(i.getComments())); assertEquals(i.getComments().size(), 3); assertEquals(i.getBids().size(), 2); t.commit(); s.close(); s = openSession(); t = s.beginTransaction(); Object[] row = (Object[]) s.getNamedQuery(Item.class.getName() + ".all").list().get(0); i = (Item) row[0]; assertTrue(Hibernate.isInitialized(i.getBids())); assertTrue(Hibernate.isInitialized(i.getComments())); assertEquals(i.getComments().size(), 3); assertEquals(i.getBids().size(), 2); t.commit(); s.close(); s = openSession(); t = s.beginTransaction(); i = (Item) s.createCriteria(Item.class).uniqueResult(); assertTrue(Hibernate.isInitialized(i.getBids())); assertTrue(Hibernate.isInitialized(i.getComments())); assertEquals(i.getComments().size(), 3); assertEquals(i.getBids().size(), 2); t.commit(); s.close(); s = openSession(); t = s.beginTransaction(); List bids = s.createQuery("from Bid b left join fetch b.item i left join fetch i.category").list(); Bid bid = (Bid) bids.get(0); assertTrue(Hibernate.isInitialized(bid.getItem())); assertTrue(Hibernate.isInitialized(bid.getItem().getCategory())); t.commit(); s.close(); s = openSession(); t = s.beginTransaction(); List pairs = s.createQuery("from Item i left join i.bids b left join fetch i.category").list(); Item item = (Item) ((Object[]) pairs.get(0))[0]; assertFalse(Hibernate.isInitialized(item.getBids())); assertTrue(Hibernate.isInitialized(item.getCategory())); s.clear(); pairs = s.createQuery("from Item i left join i.bids b left join i.category").list(); item = (Item) ((Object[]) pairs.get(0))[0]; assertFalse(Hibernate.isInitialized(item.getBids())); assertTrue(Hibernate.isInitialized(item.getCategory())); s.clear(); pairs = s.createQuery("from Bid b left join b.item i left join fetch i.category").list(); bid = (Bid) ((Object[]) pairs.get(0))[0]; assertTrue(Hibernate.isInitialized(bid.getItem())); assertTrue(Hibernate.isInitialized(bid.getItem().getCategory())); s.clear(); pairs = s.createQuery("from Bid b left join b.item i left join i.category").list(); bid = (Bid) ((Object[]) pairs.get(0))[0]; assertTrue(Hibernate.isInitialized(bid.getItem())); assertTrue(Hibernate.isInitialized(bid.getItem().getCategory())); t.commit(); s.close(); s = openSession(); t = s.beginTransaction(); s.createQuery("delete from Bid").executeUpdate(); s.createQuery("delete from Comment").executeUpdate(); s.createQuery("delete from Item").executeUpdate(); s.createQuery("delete from Category").executeUpdate(); t.commit(); s.close(); }