0

我的程序中有一个非常奇怪的行为。我有 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

先感谢您

4

2 回答 2

1

我想用户对象已分离并且与数据库不同步。所以它是从缓存中获取的。您没有在有状态会话 bean 中使用扩展的持久性上下文。因此,实体仅由实体管理器在事务中管理。尝试使用其 PK Id 搜索用户。

于 2013-09-20T20:47:26.147 回答
0

最有可能的是,在查询该用户时尚未提交用户删除事务。因此,我建议您检查交易。而且,查询该用户应该是不同的事务,如果两个操作在同一个事务中,实体管理器将找不到被删除的用户。

于 2010-12-21T12:21:12.623 回答