2010-05-17 82 views
1

我有一个简单@OneToManyPet之间Person实体:预先加载一对多与JPA2

@OneToMany(mappedBy="owner", cascade=CascadeType.ALL, fetch=FetchType.EAGER) 
public Set<Pet> getPets() { return pets; } 

我想与相关Pet s到加载所有Person秒。所以,我想出了这个(测试类中):

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration 
public class AppTest { 

    @Test 
    @Rollback(false) 
    @Transactional(readOnly = false) 
    public void testApp() { 
     CriteriaBuilder qb = em.getCriteriaBuilder(); 
     CriteriaQuery<Person> c = qb.createQuery(Person.class); 
     Root<Person> p1 = c.from(Person.class); 
     SetJoin<Person, Pet> join = p1.join(Person_.pets); 
     TypedQuery<Person> q = em.createQuery(c); 
     List<Person> persons = q.getResultList(); 
     for (Person p : persons) { 
      System.out.println(p.getName()); 
      for (Pet pet : p.getPets()) { 
       System.out.println("\t" + pet.getNick()); 
      } 
     } 

不过,打开显示了SQL日志记录,它执行3个查询(其在DB 2人)。

Hibernate: select person0_.id as id0_, person0_.name as name0_, person0_.sex as sex0_ from Person person0_ inner join Pet pets1_ on person0_.id=pets1_.owner_id 
Hibernate: select pets0_.owner_id as owner3_0_1_, pets0_.id as id1_, pets0_.id as id1_0_, pets0_.nick as nick1_0_, pets0_.owner_id as owner3_1_0_ from Pet pets0_ where pets0_.owner_id=? 
Hibernate: select pets0_.owner_id as owner3_0_1_, pets0_.id as id1_, pets0_.id as id1_0_, pets0_.nick as nick1_0_, pets0_.owner_id as owner3_1_0_ from Pet pets0_ where pets0_.owner_id=? 

任何提示吗?

感谢 Gergo

回答

2

而不是

SetJoin<Person, Pet> join = p1.join(Person_.pets); 

应该写

p1.fetch(Person_.pets);