У меня есть класс ресурсов JAX-RS. Он вызывает компонент EJB без сохранения состояния, который загружает объект (назовем его Parent
).
Parent
имеет связь @ManyToOne
с другим объектом (назовем его Child
) и настроен на тип выборки LAZY
.
Никакие дополнительные транзакционные аннотации не появляются ни на чем, поэтому EJB без сохранения состояния по умолчанию запускает транзакцию, когда это необходимо, и фиксирует транзакцию после завершения своего бизнес-метода.
В отладчике я наблюдаю, что Parent
, возвращаемое EJB, имеет null
в качестве значения Child
, как я и подозревал. Таким образом, ленивая загрузка работает нормально.
Затем мой класс ресурсов строит Response
и передает управление внутренностям JAX-RS. Опять же, ни одна транзакция не открыта.
После сериализации отображаемый JSON (в моем случае) содержит все поля Child
. Что-то во внутренностях JAX-RS каким-то образом «раздувает» эту ссылку Child
вне транзакции.
Я наблюдаю в отладчике, что действительно в какой-то момент после того, как JAX-RS взял на себя управление, ссылка Child
стала не-null
.
Я думал, что либо Child
должно было остаться null
, либо должно было быть выброшено какое-то исключение, чтобы указать, что кто-то пытался получить доступ к лениво загруженному полю. Я явно что-то неправильно понял.
При каких обстоятельствах лениво загружаемые отношения отдельной сущности JPA могут быть «раздуты» вне транзакции?
Если это имеет значение, я использую Jersey 2.10.4 через Glassfish 4.1 и EclipseLink 2.5.2 (опять же, через Glassfish 4.1).