1

我正在开发一个信息系统,但有些事情我不知道如何处理。假设我的网站允许管理员编辑用户。当两个管理员要同时编辑同一个用户时,不应该允许在第一个管理员之后单击编辑的管理员。

所以我希望在管理员单击编辑按钮时打开一个事务,并在他们发送编辑后的表单时提交。

我能想到的一种解决方案是将 EntityManager 放在命名的 ConversationScoped CDI bean 中。但我认为这不是一个好的解决方案,因为表示层应该与业务层分离,而数据库访问属于业务层。

另一种解决方案可能是将 EntityManager 放在 Stateful bean 中并管理来自 Named ConversationScoped CDI bean 的事务,该 bean 将调用 Stateful bean 上的方法。但是在 Web 层管理事务是个好主意吗?如果我决定将我的业务层部署在另一个应用程序服务器上,那么在远程 EJB 上管理事务会起作用吗?如果 EJB 被钝化,事务会丢失怎么办?

这也与另一个问题有关,当您使用 EntityManager 从数据库中检索对象时,一旦事务关闭,它就会被分离。如果对象有一些惰性初始化字段,则 Web 层无法访问它们,因为当对象返回到 Web 层时,它已分离。因此,您可以管理 Web 层中的事务,也可以遍历业务层中的惰性初始化字段。前一种解决方案似乎不正确,而后一种解决方案可能会变得非常冗长和复杂。

我知道我问了太多问题,但我真的很想知道如何正确地做到这一点。

我可以使用这些技术:CDI、Seam 3 和 EJB。

当然,如果您知道更好的解决方案,我会很高兴听到它。

提前致谢。

4

1 回答 1

2

JPA 乐观锁定机制解决了这个问题(请参阅@davidfrancis 评论)。

于 2012-06-06T13:34:31.897 回答