我正在开发一个信息系统,有一些我不知道如何处理。 假设我的网站允许管理员编辑用户。当两个管理员想要同时编辑同一个用户时,不应该允许稍后再点击编辑的管理员,而不允许第一个管理员。
因此,当管理员点击编辑按钮并在发送已编辑的表单时提交时,我希望打开一个事务。
我能想到的一个解决方案是将EntityManager放在命名的ConversationScoped CDI bean中。但我不认为这是一个很好的解决方案,因为表示层可以与业务层分开,数据库访问属于业务层。
另一个解决方案可能是将EntityManager放在有状态bean中,并从Named ConversationScoped CDI bean管理事务,该CDI bean将调用有状态bean上的方法。但是管理Web层中的事务是一个好主意吗?如果我决定将业务层部署在另一个应用程序服务器上,那么管理远程EJB上的事务会怎样?如果EJB被钝化了,交易会丢失吗?
这也与另一个问题有关,当您使用EntityManager从数据库中检索对象时,它会在事务关闭后立即分离。如果对象具有一些惰性初始化字段,则Web层无法访问它们,因为当对象返回到Web层时,它将被分离。因此,您可以管理Web层中的事务,也可以遍历业务层中的惰性初始化字段。前一种解决方案似乎不正确,后者可能会变得非常冗长和复杂。
我知道我问了太多问题,但我真的想知道如何正确地做到这一点。
我有这些技术:CDI,Seam 3和EJB。
当然,如果您知道更好的解决方案,我会很高兴听到它。
提前感谢。
答案 0 :(得分:2)
JPA乐观锁定机制解决了这个问题(参见@davidfrancis评论)。