jpa - JSF2 + EJB3 + CRUD 使用用户控件来提交或回滚?

标签 jpa jsf-2 transactions ejb crud

我正在开发一个基于 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 的非事务方法中执行删除操作,并使用 @RemoveentityManager.clear() 将取消方法也实现为非事务方法> 并将 save 方法作为事务性 @Remove 方法(不需要在其主体中执行任何操作),那么您将获得此效果。

除非您牢牢掌握 EJB 和事务,否则您最好采用第一种策略。

关于jpa - JSF2 + EJB3 + CRUD 使用用户控件来提交或回滚?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9683593/

相关文章:

hibernate - @GenerateValue(strategy = GenerationType.AUTO) 没有按预期工作

java - Spring Data Jpa 选择新问题

Primefaces 选择列表 dualList 对象变为空

hibernate 错误 - 已经有关联的托管连接

java - Spring Controller 使我的 CRUD 操作失败,对此该怎么办?

java - Hibernate - 实体审计

jsf-2 - 我可以在 primefaces 自动完成组件中使用 omnifaces 通用转换器吗?

java - JSF 数据表根据选择填充行

java - Spring+Hibernate集成: Transaction Manager doesn't work using @Transactional

database - 数据完整性和数据一致性之间有什么区别吗?