2010-05-17 9 views
1

J'ai un simple @OneToMany entre Person et Pet entités:Désireuse chargement OneToMany en veille prolongée avec JPA2

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

Je voudrais charger tous les Person s avec associés Pet s. Alors je suis venu avec cette (dans une classe de test):

@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()); 
      } 
     } 

Cependant, transformant l'enregistrement SQL sur les spectacles, qu'il exécute 3 requêtes (ayant 2 personnes dans le DB).

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=? 

Des conseils?

Merci Gergo

Répondre

2

Au lieu de

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

on devrait écrire

p1.fetch(Person_.pets);