javax.persistence.TransactionRequiredException: Executing an update/delete query

最近在springboot中整合jpa的时候碰到一个异常困扰了好几天,异常如下

   javax.persistence.TransactionRequiredException: Executing an update/delete query
	at org.hibernate.query.internal.AbstractProducedQuery.executeUpdate(AbstractProducedQuery.java:1496)

该异常一般出现在执行更新删除操作时出现,jpa要求执行这些操作时需要加上事务管理
当使用@Query调用自定义sql时在执行方法前加上@Modifying@Transactional一般就能解决
但是开发过程中由于反复出现调用自定义sql的场景,所以为了调用方便决定利用EntityManager.Query做个封装,然后就出问题了…利用EntityManager执行update语句即使加上了@Modifying@Transactional仍然出现Executing an update/delete query的异常,在反复查找后终于找到一个解决方案,如下:

public int sqlUpdate(String sql,String[] arrs){
    EntityManager em=emf.createEntityManager();
    Query query = em.createNativeQuery(sql);
    for(int i = 0; i < arrs.length;i++){
    	query.setParameter(i+1,arrs[i]);
    }
    em.getTransaction().begin();
    int num = query.executeUpdate();
    em.getTransaction().commit();
    em.close();
    return  num;
}

利用EntityManager内的事务控制器进行事务管理

你可能感兴趣的:(jpa)