Вызов удаленного EJB в EJB 3.1 - PullRequest
4 голосов
/ 05 апреля 2011

Мне нужно вызвать Remote EJB без сохранения состояния из другого веб-приложения с той же версией Glassfish (окончательная версия 3.1), которая возвращает Entity Bean (JPA 2 / Eclipselink). Я получаю ссылку на ejb в веб-приложении через Внедрение зависимости (@EJB) но объект становится пустым. Я нашел его в Google и обнаружил, что это может быть Сериализуемая проблема. Где-то я нашел это

TopLink либо изменяет классы сущностей («плетет» их) под нагрузкой или заменителями доступ к коллекции во время выполнения, чтобы быть в состоянии обнаружить ленивый доступ или измененные отношения (нет способ поддержать ленивый груз без этого или подклассы или использование прокси в во время выполнения). Что приводит нас к очень важный момент: вы не должны использовать отражение для доступа к сущности, но только через свои бизнес-методы. сотканный объект сериализуется на сервер и десериализован на клиенте это не имеет соответствующего сплетенный объект, serialVersionUIDs не будет соответствовать как расчет значение включает в себя поля класса и методы.

Так нужно ли конвертировать DTO в моем приложении ???

Ответы [ 3 ]

2 голосов
/ 12 июля 2011

Возможно, на вас влияет Ошибка Glassfish 16164 .

Предложенный обходной путь - добавить это свойство в файл persistence.xml:

<property name="eclipselink.weaving" value="false"/>

Это решило проблему в моем случае.

2 голосов
/ 11 апреля 2011

Что вы подразумеваете под "но сущность становится нулевой"? Вы вызываете метод на удаленном SessionBean и возвращаете значение NULL, или вы получаете назад и Entity, отношение которого равно NULL?

Если это нулевые отношения, это может быть проблема LAZY, если ваши отношения LAZY и не были выбраны или получены, тогда они будут нулевыми. Вам нужно либо получить его, получить к нему доступ, либо сделать его EAGER.

Если вы получаете нулевое значение, значит что-то не так.

0 голосов
/ 04 января 2015

Удаленный EJB с EclipseLink и Glassfish не работает должным образом, когда вы пытаетесь вернуть сущность.

То же самое для Hibernate, вам нужно удалить все прокси перед возвратом вашего ответа.С Hibernate, вам нужно очистить и очистить свой постоянный контекст перед удалением прокси.Если не загружен, установите ноль в атрибут.Вы можете заставить его работать с перехватчиком Java EE.

Но EclipseLink не работает как Hibernate.Даже если вы очистите свой контекст постоянства, атрибут get / set для lazy попытается извлечь.Даже вне сделки.

Если вы установите свойство name = "eclipselink.weaving" value = "false", оно будет работать, потому что EclipseLink не изменит байт-код вашего класса POJO, но ManyToOne всегда будет выбираться.Таким образом, он может загрузить базу данных в память.

Единственный способ решить эту проблему - использовать DTO или Hibernate с перехватчиком.

EDIT: Вы всегда можете переопределить сериализацию объекта с помощью интерфейса Externalization.Получите объект за полем, чтобы убедиться, что отложенная выборка не применяется.

Похоже, Openjpa также использует метод ткачества по умолчанию.http://openjpa.apache.org/entity-enhancement.html

...