在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开始交易之前的状态吗?