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_Persistence_Jpa 2.0_Java Ee 6 - Fatal编程技术网

Java JPA在扩展持久性上下文中管理实体的最佳实践

Java JPA在扩展持久性上下文中管理实体的最佳实践,java,jpa,persistence,jpa-2.0,java-ee-6,Java,Jpa,Persistence,Jpa 2.0,Java Ee 6,我使用的是CDI会话范围、Seam管理的扩展持久性上下文(PC)。这提供了对PC更细粒度的控制,并避免了谎言。我正在使用cdibean而不是ejbbean。在页面中,我检索实体列表并将它们显示在表中。从表中选择的实体记录绑定到表单,可以编辑,但在单击“保存”按钮之前不能持久化。在这里,问题就出现了,因为所有实体都是管理的,所以当我在保存操作中尝试刷新/提交一个当前实体时,编辑的实体也会被持久化。解决此类问题的首选最佳实践方法是什么。我应该在托管实体和查看/编辑实体之间使用中间POJO吗?我是否应

我使用的是CDI会话范围、Seam管理的扩展持久性上下文(PC)。这提供了对PC更细粒度的控制,并避免了谎言。我正在使用cdibean而不是ejbbean。在页面中,我检索实体列表并将它们显示在表中。从表中选择的实体记录绑定到表单,可以编辑,但在单击“保存”按钮之前不能持久化。在这里,问题就出现了,因为所有实体都是管理的,所以当我在保存操作中尝试刷新/提交一个当前实体时,编辑的实体也会被持久化。解决此类问题的首选最佳实践方法是什么。我应该在托管实体和查看/编辑实体之间使用中间POJO吗?我是否应该分离然后合并(保存前)当前进行中的实体?有什么建议吗

JPA2.0,Hibernate4.x
焊缝3(焊缝CDI、持久性、事务、面模块)
JSF2.1

Java EE 6.

如果我理解正确,那么:

  • 实体对象显示在页面上
  • 用户可以对这些对象进行更改
  • 用户可以保存对象以将更改提交到数据库
  • 我认为正确的方法是在编辑对象时分离它们,然后在保存对象时(通过合并)重新附着它们。只在内存中保留未保存的更改


    实际上,您不需要为此使用扩展的持久性上下文,因为您需要在请求之间保留的任何对象都将被分离。

    我们使用了类似的方法,但使用了EJB3 bean,没有Seam持久性上下文。不过,也许我们的经验对你有用

    这个想法是:

    • 在bean中使用扩展的
      持久上下文
    • 使所有方法不带事务-否则您的实体将在调用后提交
    • 将save方法设置为具有事务的方法
    分离实体会扼杀将实体放在前端的好处,因为每次尝试访问未加载的内容时,都会抛出
    LazyException
    。这与使用一些DTO完全相同


    希望有帮助

    我在前端使用Primefaces,默认情况下是ajax提交对实体所做的更改。在我管理Primefaces组件之后,问题就消失了