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