У меня есть отношения один-ко-многим определяется как нижеJPA - EntityGraph и Hibernate L2 Cache (EHCache)
@Cacheable
@Entity
@NamedEntityGraph(
name = "Parent.Child",
attributeNodes = {
@NamedAttributeNode("children"),
}
)
public class Parent {
private Set<Child> children;
// getter - setter
}
Сейчас в моей DAL, я звоню этот метод
@Override
public Parent getParentWithChildren(int id) {
EntityGraph<?> graph = entityManager.getEntityGraph("Parent.Child");
Map<String, Object> props = new HashMap<>();
props.put("javax.persistence.fetchgraph", graph);
return entityManager.find(Parent.class, id, props);
}
Поскольку я загрузил родителя с детьми, я должен иметь возможность использовать детей вне сделки. Но я получаю Lazyinitialization Exception. Это происходит только при включении кэша спящего режима уровня 2 - ehcache. Если я отключу его из config, он работает так, как ожидалось. Также, если я инициализирую сбор явно после , найдем, он работает как ожидалось. Так это ошибка ?. Я использую Hibernate 5.2.6.Final с JPA 2.1.
EDIT: Еще одна вещь, которую я заметил, это то, что сущность загружается нормально в первый раз, так что проблема должна быть связана с hibernate & поставщиком кеша.
У меня такая же ситуация. Я не использую кеш-память L2. Я понял, что если объект уже находится в контексте персистентности, следующий em.find с подсказкой fetchgraph ничего не загружает из базы данных. Мне кажется, это тоже ошибка. – srnjak
Я думаю, что это тоже относится к кешу сеанса. Это подтвержденная ошибка, и она отмечена как разрешенная в 5.2.10. – user2578525