首页 > 解决方案 > java:jpa 中的回滚何时会失败?

问题描述

我正在使用 JPA,并在调用函数之前开始事务,该函数又将一些数据存储到数据库中。然后在执行函数调用后结束事务。但我也使用 entityManager.flush() 和 entityManager.clear() 猜测使用 clear() 会释放内存。在结束交易之前。请纠正我。当我执行程序时,它无法回滚。

我还尝试删除flush()和clear(),但我仍然无法回滚。当我使用清除和刷新时,回滚何时会失败?

标签: javajparollback

解决方案


我还使用 entityManager.flush() 和 entityManager.clear() 猜测内存将在使用 clear() 时被释放。

好吧,您应该停止猜测并开始阅读一些文档。

EntityManager自行刷新tx.commit(),并且实体管理器在关闭时被清除。如果您正在使用容器管理器事务,则不必担心刷新和清除实体管理器。如果您使用的是 JavaSE,那么您使用 DB 的正常工作流程应如下所示:

  1. 创建新的实体管理器
  2. 开始交易
  3. 做你的工作 - 删除/更新/插入任何东西
  4. 如果需要,提交事务/回滚
  5. 关闭实体管理器

通常这将在小块中try-catch-finally关闭

EntityManager是轻量级和短寿命的组件。您应该在需要时创建一个,并在使用后立即关闭它。应该是一个单例实例,并且只创建一次(大多数情况下)是EntityManagerFactory


推荐阅读