我正在开发一个基于 JSF2 和 Glassfish 3.1 的 Java EE 应用程序。应用程序必须提供对数据库表的 CRUD 操作。数据库表数据使用具有 incell 编辑行为的 primeface 数据表显示。 我想让用户
- 修改、添加和删除表格中的元素以及
- 仅当用户确定其更改(按下命令按钮)时才提交
- 当用户想要放弃其更改时回滚
表有一个实体,无状态 EJB 负责与实体管理器的接口(interface)以访问数据库。
问题是,每次我删除表中的一行时,都会提交事务,而用户没有任何控制权。
如何实现这种用户对提交/回滚的控制?
最佳答案
The problem is that everytime I remove a row in the table, the transaction gets committed without any control left to the user.
这听起来很奇怪。如果您正在编辑数据表中的数据并回发这些编辑(通过 AJAX 或直接)并且数据源自无状态 bean,那么它只能是您正在处理独立实体的数据。
对这些实体或包含它们的列表的更改不会自动反射(reflect)在数据库中。在这种情况下,不存在自动提交事务的概念。我强烈不同意上面Nayan给出的答案。是的,用户事务可以让您控制提交,但这似乎根本不是您的问题。
虽然您可能应该显示一些代码,但我的猜测是您只是在用户的每次删除操作之后在 EJB 服务上调用某种删除方法,然后期望相同的事务和持久性上下文仍然存在。但在无状态 bean 中,一旦退出最初为您提供实体的方法,这些内容就会消失。
您的最佳策略是让用户操作仅对 @ViewScoped
支持 bean 缓存的数据进行操作。然后,当且仅当用户确认更新操作时,您才能一次性调用 EJB 服务并包含所有更改的项目。如果有一个父实体引用了一个列表,其中包含您删除的所有项目,您只需传递此父实体并确保在关系上设置了级联删除。
也就是说,您似乎认为自己已经得到的模式得到了支持。此模式涉及使用 @Stateful
session bean 和扩展持久性上下文
。在这种情况下, session bean 的持久性上下文将缓存您的所有更改,直到您再次将其与事务关联为止。如果您在 session bean 的非事务方法中执行删除操作,并使用 @Remove
和 entityManager.clear()
将取消方法也实现为非事务方法> 并将 save 方法作为事务性 @Remove 方法(不需要在其主体中执行任何操作),那么您将获得此效果。
除非您牢牢掌握 EJB 和事务,否则您最好采用第一种策略。
关于jpa - JSF2 + EJB3 + CRUD 使用用户控件来提交或回滚?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9683593/