【问题标题】:How to stop auto commit in EJB-JPA tx如何在 EJB-JPA tx 中停止自动提交
【发布时间】:2018-12-20 14:13:43
【问题描述】:

我有一个无状态的 EBJ,我正在使用 JPA 来管理数据库交互。以下是我需要您帮助的场景。

  1. EJB 收到获取数据的调用 (getCustomer())。
  2. GetCustomer 用于使用 JPA 从数据库中读取客户实体。
  3. 客户实体有一种从属性中删除空格的方法。这是用@PostLoad 注释的。基本上,这会修改持久性上下文中的实体。

现在,当向客户端发送响应时(事务完成后),它会触发更新 SQL 到数据库以更新数据集(在步骤 3 中修改)。

如果你能看到这个操作,它本质上是只读的。但是由于我的数据有很多空格,因此我必须在实体对象中对其进行修剪。但是这种方法会触发更新 SQL,这不是预期的。

能否请您告诉我解决此问题的最佳方法或如何隔离和同步)EJB tx 和 JPA tx。

【问题讨论】:

    标签: java jpa transactions ejb


    【解决方案1】:

    您可以声明您的 getCustomer() 不支持交易:

    @TransactionAttribute(NOT_SUPPORTED)
    public Customer getCustomer()
    

    在 Java EE 教程中了解有关事务的更多信息: https://docs.oracle.com/javaee/7/tutorial/transactions003.htm

    【讨论】:

    • 嗨 Simon,感谢您的快速响应 - getCustomer 是一个 DAO 方法,而这个 TransactionAttribute 是一个 ejb 注释。我不能在 DAO 层中使用 *ejb 注释。此注释在客户和业务之间有效,但我需要在业务和 DAO(数据库)之间使用类似的解决方案。
    • 为什么不让你的 DAO 成为 EJB?
    【解决方案2】:

    不必为了满足您的要求而搞乱事务管理。

    您的代码应在从您的 DAO 返回之前调用 javax.persistence.EntityManager.clear()。这会将您的实体 bean 从持久性上下文中分离出来,而持久性上下文将不再跟踪它。来自 java 文档:

    清除持久性上下文,导致所有托管实体分离。对尚未刷新到数据库的实体所做的更改将不会被持久化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-11
      • 1970-01-01
      • 2014-04-16
      • 2010-11-16
      • 1970-01-01
      • 2021-07-18
      • 2018-10-05
      相关资源
      最近更新 更多