2010-05-17 78 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);