2013-04-26 4 views
0

Итак, я разрабатываю webapp и Im пытаюсь использовать JPA для доступа к моей базе данных. Однако я получаю объекты из своей базы данных с помощью EJB, если я получаю еще один экземпляр из EJB и вношу изменения в него, изменения не отражены в моей старой сущности. Более того, когда я пытаюсь обновить свой старый объект, я получаю сообщение об ошибке, указывающее, что объект не управляется. Я могу придумать работу, мне просто интересно, что я делаю неправильно?EJB Entity не обновляется с EntityManager

ответ

0

Хорошо, это выглядит следующим образом.

EJB + JPA живет в контейнере EJB. Ваше веб-приложение живет в контейнере веб-приложений. Оба контейнера являются частью сервера приложений, но они сообщаются, как если бы Web Containter был просто клиентом компонентов EJB.

Итак, у вас типичный сценарий клиентского (веб-приложения) - сервера (EJB + JPA).

Теперь, если вы переносите сущность из EJB на клиентскую сторону, она не знает об изменениях, сделанных на сервере - это обычный объект, который у вас есть на стороне клиента (он «забывает» его происхождение EJB/JPA). Вот почему вы не видите никаких изменений в веб-приложении, даже если вы меняете аналогичную сущность в контейнере EJB.

Вы должны синхронизировать свой объект на стороне клиента и тот, который хранится в контейнере EJB вручную.

Вторая проблема - сущность не управляется. Когда вы отправляете объект с клиентской стороны в контейнер EJB, тогда контейнер EJB не делает никаких предположений об этом сущности - он рассматривает его как обычный объект.

Для того, чтобы рассказать контейнер EJB «эй, посмотри, этот объект не просто какой-то случайный объект, это сущность, которую я хочу ВАМ», вам необходимо вызвать этот объект EntityManager.merge(entity), прежде чем делать какие-либо дальнейшие действия.

Этот метод добавляет объект в постоянный кэш контекста и возвращает объект, прикрепленный к сеансу диспетчера сущностей.

Это важно! Вам нужно изменить правильный объект

Object addedToEM = EntityManager.merge(entity) 

Если вы хотите, чтобы делать какие-либо обновления на стороне сервера, вам необходимо изменить addedToEM объект (смотри, например, JPA EntityManager: Why use persist() over merge()? для хорошего объяснения).