У меня возникла проблема, которая противоречит моему пониманию того, как это должно работать. У меня есть тест 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 вместо сущности лучше, я знаю... у нас было это обсуждение, и я был отклонен)