Я использую EntityGraphs jpa 2.1 для изменения различных запросов jpa, и в некоторых случаях EntityGraphs не работают должным образом. Простой вариант использования, с которым я борюсь, - это
Author в качестве родительского класса с однонаправленным отношением один ко многим к дочернему классу Book, и я хочу получить результаты авторов для данного имени книги, например findAllAuthorsByBookName.
мой класс Author выглядит так
@Entity
@NamedEntityGraph(name = "graph.author.detail", attributeNodes = {
@NamedAttributeNode("books")
})
public class Author extends GenericEntity {
@OneToMany
@JoinColumn(name="author_id")
private Set<Book> books = new HashSet<Book>();
....
В книге нет ссылки на автора, поэтому она выглядит так
@Entity
public class Book extends GenericEntity {
...
Общий класс Entity просто имеет атрибуты id и name.
Вот как я запрашиваю данные.
EntityGraph graph = em.getEntityGraph("graph.author.detail");
Author author = (Author) em.createQuery("select a from Author a left join a.books b where b.name = 'book 1'")
.setHint("javax.persistence.loadgraph", graph).getResultList().get(0);
Это не работает. Я ожидаю, что класс Author будет возвращен с загруженными атрибутами книг, потому что он указан в графе сущностей, но в этом случае атрибут книг загружен лениво и выдает исключение LazyInitialziation. Если вместо этого я использую атрибут автора для предложения where (например, select a from Author a where a.id = 1
), то он работает нормально и с готовностью загружает атрибут books.
Любые идеи были бы хорошы.