コード例 #1
0
  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();
  }