2017-01-10 2 views
1

У меня есть отношения один-ко-многим определяется как ниже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 & поставщиком кеша.

+0

У меня такая же ситуация. Я не использую кеш-память L2. Я понял, что если объект уже находится в контексте персистентности, следующий em.find с подсказкой fetchgraph ничего не загружает из базы данных. Мне кажется, это тоже ошибка. – srnjak

+0

Я думаю, что это тоже относится к кешу сеанса. Это подтвержденная ошибка, и она отмечена как разрешенная в 5.2.10. – user2578525

ответ

0

Нет. Это не ошибка. Я думаю, Hibernate задерживает загрузку из кеша, пока это действительно необходимо. Реализация может решить, чтобы быть ленивым, как сочтет нужным, если вы не попросите увлечься желанием.

Таким образом, общее правило состоит в том, чтобы загрузить все, что вам нужно, прежде чем выходить из транзакции (до завершения сессии Hibernate, если быть точным).

+0

. Я уже использую граф выборки для активной загрузки детской коллекции. – user2578525

+0

. Вы не даете мне достаточной информации, чтобы доказать это, но я подозреваю, что это фактически объекты в коллекции, которые проксируются для ленивой загрузки. – Henri

+1

См. Объект реквизита. Im, определяющий граф выборки – user2578525

Смежные вопросы