jpa - 重试 JPA 事务
问题描述
有没有办法重试在 JPA 中因回滚异常而失败的事务?据我所知,如果事务失败,所有托管实体都会分离。
基本上我想要的是:我加载一个实体,用户对该实体进行更改,然后保持更改。
如果用户进行了有效的更改,一切正常。但是如果用户出错并且事务失败,他们当前必须丢弃所有工作,重新加载实体,重做工作(没有错误)并重试事务。
我尝试使用新的 EntityManager 来保持基本上像这样:
tmpEm = createEntityManager();
final EntityObject find = tmpEm.findById(EntityObject.class, toPersistEntity.getId());
if (find != null) {
tmpEm.beginTransaction();
tmpEm.merge(toPersistEntity);
tmpEm.commitTransaction();
} else {
tmpEm.beginTransaction();
tmpEm.persist(find);
tmpEm.commitTransaction();
}
但这并不总是有效,因为 EntityObject 包含一个 OneToMany 集合,我不知道是否添加了或添加了哪些实体(我可以找到它,但这需要我可以坚持的每个实体的实体特定代码)。
有没有更好的办法?我可以以某种方式返回到 EntityManager 在开始交易之前的状态吗?
解决方案
推荐阅读
- java - 有没有办法将 Google 的自定义方法与 Jersey 资源一起使用?
- javascript - api加载后javascript继续刷新页面
- alfresco - 代码中缺少 Alfresco pickerchildren.get.js
- database-design - 处理避免不一致状态的多状态系统
- python - 列出我使用 np.loadtxt 创建的数组的理解
- java - 将数据通过捆绑包从 Activity 传递到 Fragment 时获取 null
- python - 无法使用 paramiko 执行一些 unix 命令(我可以使用 pexpect)
- javascript - 使用 babel-loader + babel/preset-env 填充 DOM 函数
- c# - 带有 ScrollHeader 和 WrapPanel 的 ListView (ItemsPanel.ItemsPanelTemplate)
- google-cloud-platform - 如果没有 root 用户,云 sql mysql 消失