Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 客户端与服务器和JPA事务的对话_Java_Jpa_Ejb_Cdi_Seam3 - Fatal编程技术网

Java 客户端与服务器和JPA事务的对话

Java 客户端与服务器和JPA事务的对话,java,jpa,ejb,cdi,seam3,Java,Jpa,Ejb,Cdi,Seam3,我正在开发一个信息系统,但有些事情我不知道如何处理。 假设我的网站允许管理员编辑用户。当两个管理员希望同时编辑同一用户时,不应允许稍后单击“编辑”的管理员编辑第一个用户 因此,我希望在管理员单击“编辑”按钮时打开一个事务,并在发送已编辑的表单时提交该事务 我能想到的一个解决方案是将EntityManager放在一个命名的ConversationScope CDIBean中。但我认为这不是一个好的解决方案,因为表示层应该与业务层分离,数据库访问属于业务层 另一个解决方案是将EntityManage

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

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

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

另一个解决方案是将EntityManager放在有状态bean中,并从一个命名的ConversationScope CDIBean管理事务,该CDIBean将调用有状态bean上的方法。但是,在web层中管理事务是一个好主意吗?如果我决定在另一个应用服务器上部署我的业务层,那么在远程EJB上管理事务会起作用吗?如果EJB被钝化,事务会丢失吗

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

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

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

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


提前感谢。

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

在谷歌搜索乐观锁定。悲观锁定是你所描述的,但乐观是当今的常态。Doh为什么我不回答这个问题,并为此获得一些声誉呢!没关系,很高兴它有帮助;]。