Стремитесь загрузить OneToMany в Hibernate с JPA2 - PullRequest
1 голос
/ 17 мая 2010

У меня есть простые @OneToMany между Person и Pet сущностями:

@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ő

1 Ответ

2 голосов
/ 28 мая 2010

вместо

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

надо написать

p1.fetch(Person_.pets);
...