2012-06-12 5 views
5

Przy użyciu obiektu JPA EntityManager i JPA Query, w jaki sposób mogę przesłonić coś, co ma adnotację @OneToMany (fetch = FetchType.EAGER), które zostanie pobrane leniwie w zapytaniu?Jak przesłonić FetchType.EAGER, aby być leniwym w środowisku wykonawczym

Gdybym miał obiekt kwerendy hibernacji, mógłbym go utworzyć obiekt kryteriów i używając tego, ustawić typ pobierania, aby był leniwy. Ale muszę użyć obiektu kwerendy JPA. Czy istnieje rozwiązanie tego problemu?

+0

Tak, możesz - http://stackoverflow.com/questions/4388486/fetchmode-in-jpa-2-criteriaquery –

+0

Zobacz: http: //stackoverflow.com/questions/17847289/ignore-a-fetchtype-eager-in-a-relationship. – Dherik

Odpowiedz

4

Nie ma sposobu, aby to zrobić, nawet z natywnym interfejsem API Hibernacji. Jeśli powiązanie jest zdefiniowane jako EAGER, zawsze będzie ono ładnie ładowane i nie można tego zmienić za pomocą zapytania.

Odwrotna sytuacja nie jest prawdą: można szybko załadować leniwą asocjację za pomocą zapytania.

+0

Cholera. Dzięki, tak, używam słowa kluczowego fetch w HQL, aby to zrobić. – hugelgupf

-1

Przejrzyj profile pobierania w trybie hibernacji lub wykresy jednostek JPA. Ten problem został rozwiązany, ponieważ zadałeś to pytanie w 2012 roku.

+0

To nie zostało rozwiązane, patrz: https://hibernate.atlassian.net/browse/HHH-8776 - nie można zignorować obciążenia EAGER nawet przy użyciu EntityGraphs. –

+0

Ach, moje przeprosiny, zignorujcie moją odpowiedź. Typowy przypadek użycia to odwrotne oznaczenie twoich jednostek jako leniwie pobrane i użyj wykresu jednostki, aby zmienić typ pobierania, aby był chętny w czasie wykonywania. Nie wiedziałem o HHH-8776, dobrze wiedzieć, dzięki. – mancini0