У меня проблема, которая противоречит моему пониманию того, как она должна работать. У меня есть тест Arquillian, который проверяет метод репозитория с запросом JPA.JPA EntityManager.detach() все еще загружает ленивые отношения
Тест сохраняет объект, а затем сохраняется другой объект с первым сохраняемым объектом в поле. Затем он вызывает метод репозитория. Затем тест отделяется (и очищает entitymanager, проверяет, что объект не содержится в em и т. Д. И т. Д.). В последнем случае проверка проверяет, существует ли соответствующий объект или нет (он не должен, так как запрос не должен читать отношение).
Как и ожидалось, при поиске в отладчике связанный объект имеет значение null, но когда assert фактически использует метод 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-объекты вместо лица лучше, я знаю ... мы провели эту дискуссию, и я отменил)