4

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

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

4

3 回答 3

3

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

这个想法是:

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

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

希望能帮助到你!

于 2012-07-19T16:37:01.643 回答
2

如果我理解正确,那么:

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

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

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

于 2012-07-01T00:23:32.700 回答
0

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

于 2012-07-21T08:32:56.487 回答