我的程序中有一个非常奇怪的行为。我有 2 个类(LogIn 类和 CreateGame 类),我使用注释在每个类中注入了一个 EntityManager
@PersistenceContext(unitName="myUnitPU")
EntityManager entitymanger;
在某些时候,我从 LogIn 类中的方法中使用 entitymanger.remove(user) 从数据库中删除了一个名为“user”的对象。业务逻辑是用户可以托管和加入游戏(同时),因此删除用户数据库中有关用户创建的游戏的所有条目都将被删除,并且所有显示用户加入的游戏的条目都将被删除还。
之后,我调用另一个函数,该函数使用 LogIn 类中的方法检查用户是否存在
entitymanager.find(user)
令人惊讶的是,它找到了用户。之后,我调用 CreateGame 类中的一个方法,该方法尝试再次使用来查找用户
entitymanger.find(user)
该类中的实体管理器无法找到用户(这是预期的结果,因为用户已被删除且不在数据库中)
所以问题是:为什么一个类中的实体管理器在另一个类中找不到用户(这是错误的)?有没有人遇到过同样的问题?
PS:当用户托管了一个由另一个用户(我们称他为 Buser)加入的游戏并且 Buser 制作了一个由当前用户加入的游戏时,就会出现此“错误”。
GAME | HOST | CLIENTS
game1 | user | userB
game2 | userB | user
在这种情况下,通过删除用户,将删除游戏 1 并将用户从游戏 2 中删除,因此结果是
GAME | HOST | CLIENTS
game2 | userB |
PS2:Beans 是 EJB3.0。这些方法是从委托类中调用的。委托类中的 bean 使用 InitialContext.lookup() 方法进行实例化。请注意,对于登录、创建、加入游戏,适当的委托类调用执行事务的对应 EJB。在 logOut 的情况下,委托调用 EJB 以注销用户,但因为必须完成其他事情(如上所述),此 EJB 调用其他 EJB(再次使用 lookup() ),它具有诸如 removegame()、removeUserFromGame() 之类的方法等等。在执行这些方法之后,用户将被注销。也许这与第一个实体管理器由委托调用但第二个来自 EJb 内部的事实有关,这就是为什么一个实体管理器可以看到不存在的用户而另一个不能?此外,所有方法都有 TRANSACTIONTYPE.REQUIRED
先感谢您