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

时间:2012-06-30 15:02:14

标签: java jpa persistence jpa-2.0 java-ee-6

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

JPA 2.0,Hibernate 4.x
Seam 3(焊接CDI,持久性,交易,面向模块)
JSF 2.1
Java EE 6。

3 个答案:

答案 0 :(得分:3)

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

这个想法是:

  • 在bean中使用extended PersistenceContext
  • 使所有方法无需交易 - 否则您的实体将在通话后提交
  • 使save方法成为一个事务。

分离实体会杀死将实体提供给前端的好处,因为每次尝试访问未加载的内容时都会抛出LazyException。这与使用一些DTO完全一样。

希望它有所帮助!

答案 1 :(得分:2)

如果我理解正确,那么:

  1. 实体对象显示在页面上
  2. 用户可以对这些对象进行更改
  3. 用户可以保存对象以提交对数据库的更改
  4. 我认为这里的正确方法是在编辑对象时分离对象,然后在保存时重新附加对象(通过合并)。这样就可以保留内存中未保存的更改。

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

答案 2 :(得分:0)

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