JPA EntityManager.detach() по-прежнему загружает ленивые отношения

У меня возникла проблема, которая противоречит моему пониманию того, как это должно работать. У меня есть тест Arquillian, который проверяет метод репозитория с запросом JPA.

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

Как и ожидалось, при просмотре в отладчике связанный объект имеет значение null, но когда утверждение фактически использует метод getRelatedObject, он загружает связанный объект.

Псевдокод для уточнения (надеюсь):

FirstObject f = new FirstObject();
em.persist(f);
SecondObject s = new SecondObject();
s.setFirstObject(f);
em.persist(f);
MyRepo r = new MyRepo();
SecondObject result = r.runQuery(f.getId());
em.detach(result); //result.getFirstObject is null
em.clear();
assertIsNull(result.getFirstObject()); //loads first object and test fails

Насколько я понимаю, это неправильно, должен ли связанный объект по-прежнему загружаться? Я ожидал исключения LazyInit.

Если я неправильно понимаю, как убедиться, что запрос не заполняет связанный объект, которого я не буду?

(да, использование dto-objects вместо сущности лучше, я знаю... у нас было это обсуждение, и я был отклонен)


person Roland    schedule 01.06.2016    source источник


Ответы (1)


В книге Pro JPA 2 (Apress, p160) примечания

«Поведение при доступе к незагруженному атрибуту, когда объект отсоединен, не определено. Некоторые поставщики могут попытаться разрешить отношения, в то время как другие могут просто выдать исключение или оставить атрибут неинициализированным».

У меня нет личного опыта работы с EclipseLink, и я могу найти что-либо определенное в документации в этой области, однако все следующие ссылки предполагают, что EclipseLink попытается разрешить отношения, когда вы получите доступ к ленивой ассоциации для отдельной коллекции.

Отложенная загрузка Eclipselink

http://issues.apache.org/jira/browse/OPENJPA-2483

http://blog.ringerc.id.au/2012/06/jpa2-is-very-inflexible-with-eagerlazy.html

person Alan Hay    schedule 01.06.2016