java - 客户端与服务器的对话以及 JPA 事务

标签 java jpa ejb cdi seam3

我正在开发一个信息系统,有一些东西我不知道如何处理。 假设我的网站允许管理员编辑用户。当两个管理员想要同时编辑同一用户时,不应允许比第一个管理员晚单击“编辑”的管理员这样做。

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

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

另一个解决方案可能是将 EntityManager 放入有状态 bean 中,并管理来自命名 ConversationScoped CDI bean 的事务,该 CDI bean 将调用有状态 bean 上的方法。但是在 Web 层管理事务是一个好主意吗?如果我决定将业务层部署在另一台应用程序服务器上,管理远程 EJB 上的事务是否有效?如果 EJB 被钝化,事务会丢失吗?

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

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

我拥有这些技术:CDI、Seam 3 和 EJB。

当然,如果您知道更好的解决方案,我很乐意听到。

提前致谢。

最佳答案

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

关于java - 客户端与服务器的对话以及 JPA 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10914844/

相关文章:

java - 如何搭建沙箱环境

mysql - JPA Hibernate - 多种数据库方言和 nvarchar(length) 数据类型

java - 实体 - 从 session 中检索的两个实体是否具有相同的值

java - 参数太少的 ObjectDB Select 查询

maven - 实例化 EJBContainer 时出现异常

mysql - 在 JBoss 5.1 的 MDB (ActiveMQ) 中捕获 MySQL 死锁

Java 模式不返回最左边的匹配

java - 将大数据从数据库导出到 CSV

java - 无法验证 serde : org. openx.data.jsonserde.jsonserde

ejb - 无法访问作为 REST 服务公开的 EJB