2010-05-17 1 views
1

У меня есть простой @OneToMany между Person и Pet сущности:жадная загрузка OneToMany в Hibernate с JPA2

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

Я хотел бы загрузить все Person с с ассоциированными Pet с. Так что я пришел с этим (в тестовом классе):

@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 запросов (имеющие 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=? 

Любые советы?

Благодаря Gergő

ответ

2

Вместо

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

один должен написать

p1.fetch(Person_.pets); 

 Смежные вопросы

  • Нет связанных вопросов^_^