У меня очень странное поведение в моей программе. У меня есть 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
Заранее спасибо