当我尝试编写时,我得到org.springframework.orm.jpa.JpaSystemException抛出的异常,即选择了rollback only参数。我知道这个错误与什么有关,但我不知道如何绕过它。 发生此错误是因为execute()方法抛出异常 下面是我的伪代码:
public class MyService
{
MyJpaRepository myJpaRepository;
EntityManager entityManager;
@Transactional
@Override
public void doSomething(){
MyObject myObject = myJpaRepository.findOne(1L);
Try<Integer>result = updateChild(myObject.getchild());
myObject .addResult(result .get());
myJpaRepository.save(myObject );
}
Try<Integer>updateChildren(MyObjectChilden child) {
String query = child.prepareQuery("xxx");
Try<Integer> result = Try.of(() -> execute(query));
if(result.isFailure()){
String query = child.prepareQuery("YYY"); // if I throw the error unique constraint validation change to "YYY"
result = Try.of(() -> execute(query ));
}
return result
}
private Integer execute(String query) {
final Query nativeQuery = entityManager.createNativeQuery(query); // Can throw a unique constraint validation error
return (Integer) nativeQuery.getSingleResult();
}
}
一般来说,我的想法是我已经提取了execute()以便能够多次使用它,但是对于另一个查询,不幸的是这个方法会抛出异常,这意味着只选择了回滚参数,无法写入数据库
答案 0 :(得分:0)
该行为符合规范,请参阅here:
除了NoResultException,NonUniqueResultException,LockTimeoutException和QueryTimeoutException的实例之外的所有PersistenceException实例都将导致当前事务(如果一个处于活动状态且已连接到持久性上下文)被标记为回滚。
所以要解决这个问题,你应该首先查询数据库,看看要插入的行是否已存在,或者在多个事务中分解代码。