Отключение сущностей в EclipseLink
У меня проблема с отсоединением сущностей в JPA 2.1 EclipseLink.
У меня есть приложение JavaEE с некоторыми объектами, у которых все отношения установлены для отложенной загрузки. Я использую join fetch во всех моих запросах к базе данных, чтобы получать только те объекты, которые мне нужны. Я использую Джексона (FasterXml) для преобразования объектов в JSON (для JAX-RS и т. Д.)
Всякий раз, когда я выбираю какую-либо сущность из базы данных, я отсоединяю эту сущность перед ее возвратом, чтобы избежать выполнения слишком большого количества запросов к базе данных, когда Джексон преобразует этот объект в JSON (поскольку это преобразование вызывает все получатели в преобразуемой сущности).
Моя проблема в том, что отсоединение не работает, и когда я просматриваю журналы JPA, я вижу, что все члены сущности конвертируются и загружаются с помощью запроса в базе данных. Это происходит, когда Джексон конвертирует объект в JSON, и я предполагаю, что это потому, что Джексон вызывает геттеры при конвертации объекта. Почему это происходит и как я могу это исправить?
0 ответов
Считалось, что отсоединение для EclipseLink используется только для прекращения отслеживания изменений и извлечения его из EM по соображениям производительности. Доступ к невыгруженному атрибуту в соответствии со спецификацией JPA приводит к исключению; то, что на самом деле ни один пользователь не запрашивал на раннем этапе, поэтому поведение не было реализовано. Если вам нужно такое поведение, запросите его.
Любой может проверить состояние выборки ленивого свойства в своем методе доступа и вызвать исключение приложения. Это потребует изменения результирующего расширенного кода Java, который EclipseLink генерирует с переплетением для доступа к ленивым свойствам.
Другим решением может быть использование запроса конструктора. Запросы конструктора вместо того, чтобы возвращать объекты управляемой сущности, передают выбранные значения конструктору java, поэтому включаются только данные, полученные в рамках запроса. Эти объекты не являются сущностями и поэтому полностью отсоединены, и любой объект Java может быть построен, даже существующие классы сущностей.