Один entityManger находит сущность, другой нет - PullRequest
0 голосов
/ 20 декабря 2010

У меня очень странное поведение в моей программе. У меня есть 2 класса (класс LogIn и CreateGame), где я ввел EntityManager в каждом с помощью аннотации

  @PersistenceContext(unitName="myUnitPU")
  EntityManager entitymanger;

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

После этого я вызываю другую функцию, которая проверяет, существует ли пользователь, используя метод в классе LogIn

  entitymanager.find(user)

, что довольно удивительно, находит пользователя. После этого я вызываю метод в классе CreateGame, который пытается найти пользователя, снова используя

  entitymanger.find(user) 

сущность в этом классе не может найти пользователя (что является ожидаемым результатом, когда пользователь удален, а его нет в базе данных)

Итак, вопрос в том, почему менеджер сущностей в одном классе находит пользователя (что не так), а другой не находит его? У кого-нибудь когда-нибудь бывает такая же проблема?

PS: эта «ошибка» возникает, когда пользователь размещал игру, к которой присоединился другой пользователь (назовем его Бузер), и Бузер создал игру, к которой присоединился текущий пользователь.

 GAME  |  HOST  | CLIENTS   
 game1 |  user  | userB
 game2 |  userB | user

, где в этом случае при удалении пользователя игра1 удаляется, а пользователь удаляется из игры2 так что результат

 GAME  |  HOST  | CLIENTS   
 game2 |  userB | 

PS2: Фасоль EJB3.0. Методы вызываются из класса делегата. Бины в классе делегата создаются с помощью метода InitialContext.lookup (). Обратите внимание, что для входа в систему, создания и присоединения к играм соответствующий класс делегата вызывает соответствующий EJB, который выполняет транзакции. В случае logOut делегат вызывает EJB для выхода из системы пользователя, но, поскольку необходимо выполнить другие действия (как сказано выше), этот EJB вызывает другой EJB (снова используя lookup ()), у которого есть такие методы, как removegame (), removeUserFromGame () и т. д. После выполнения этих методов пользователь выходит из системы. Может быть, это как-то связано с тем фактом, что первый менеджер сущностей вызывается делегатом, а второй - внутри EJb, и поэтому один сущностный менеджер может видеть несуществующего пользователя, а другой - нет? Также все методы имеют TRANSACTIONTYPE.REQUIRED

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 21 сентября 2013

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

0 голосов
/ 21 декабря 2010

Скорее всего, транзакция удаления пользователя не была зафиксирована, пока этого пользователя запрашивали. поэтому я бы посоветовал вам проверить транзакции. А также, запрос этого пользователя должен быть другой транзакцией, если бы обе операции были в одной и той же транзакции, менеджер объектов не нашел бы удаленного пользователя.

...