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



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

JPA 2.0, Hibernate 4.x
焊缝 3(焊接 CDI、持久性、事务、面模块)
JSF 2.1
Java EE 6.

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

这个想法是:

  • 在豆子中使用extended PersistenceContext
  • 使所有方法没有事务 - 否则您的实体将在调用后提交
  • 使 Save 方法成为具有事务的方法。

分离实体将扼杀将实体放在前面的好处,因为每次尝试访问未加载的内容时,您都会抛出LazyException。这与使用某些DTO完全相同。

希望对您有所帮助!

如果我理解正确,那么:

  1. 实体对象显示在页面上
  2. 用户可以对这些对象进行更改
  3. 用户可以保存对象以将更改提交到数据库

我认为这里的正确方法是在编辑对象时分离对象,然后在保存对象时重新附加它们(通过合并)。这只会将未保存的更改保留在内存中。

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

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

最新更新