Java 如何在JpaRepository上运行自定义更新查询?(TransactionRequiredException)
我试图在spring中编写两个本机SQL查询 我在服务类中使用SQL的查询注释为:Java 如何在JpaRepository上运行自定义更新查询?(TransactionRequiredException),java,sql,hibernate,jpa,jpql,Java,Sql,Hibernate,Jpa,Jpql,我试图在spring中编写两个本机SQL查询 我在服务类中使用SQL的查询注释为: @Transactional @Scheduled(cron = "0 0/1 * * * *") void testMethod() { String query = "UPDATE BUDGET_GROUP_SPEND_SUMMARY BSS, USER U, EMPLOYEE_MOVE_STAGE EMS, BUDGET B, SERVICE_GROUP SG " +
@Transactional
@Scheduled(cron = "0 0/1 * * * *")
void testMethod() {
String query = "UPDATE BUDGET_GROUP_SPEND_SUMMARY BSS, USER U, EMPLOYEE_MOVE_STAGE EMS, BUDGET B, SERVICE_GROUP SG " +
"SET BSS.BULK_RECALC_LOCK = true " +
"WHERE BSS.EMPLOYEE_ID = U.USER_ID " +
"AND U.USER_ID = EMS.USER_ID " +
"AND BSS.BUDGET_GROUP_ID = B.BUDGET_ID " +
"AND B.BUDGET_SERVICE_GROUP_ID IS NOT NULL " +
"AND EMS.MOVE_STAGE_ID IN (1,2) " +
"AND U.USER_CUSTOMER_STATUS IN ('MOVE_COMPLETED', 'LOST', 'GET_FEEDBACK', 'CLOSED_NO_FEEDBACK', 'ON_ASSIGNMENT') " +
"AND B.BUDGET_SERVICE_GROUP_ID = SG.SERVICE_GROUP_ID " +
"AND SG.MOVE_STAGE_ID = 1";
Query nq = entityManager.createNativeQuery(query);
nq.executeUpdate();
}
但我收到了这个错误:
2019-09-12 18:28:00,012 ERROR [] o.s.s.s.TaskUtils$LoggingErrorHandler:95 - Unexpected error occurred in scheduled task.
javax.persistence.TransactionRequiredException: Executing an update/delete query
at org.hibernate.jpa.spi.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:54)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
如果我使用entityManager.getTransaction.begin;和entityManager.getTransaction.commit
然后是投掷:
2019-09-12 18:36:00007错误[]
o、 s.s.s.TaskUtils$LoggingErrorHandler:95-发生意外错误
在计划任务中。java.lang.IllegalStateException:不允许
在共享EntityManager上创建事务-使用Spring事务
或者EJBCMT
在org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManager上
为什么会出现这个错误
或者有没有其他更好的方法来使用Jpa存储库实现自定义更新查询
我假设Spring不会创建事务代理,因为您的方法不是公共的。
如果您使用的是声明式Spring事务管理器,则应始终避免手动事务管理
应用程序应该有一个单独的层来处理DB调用。在您的例子中,它是JPA存储库。因此,最好在自定义Jpa存储库中实现查询,在此处插入其实例并调用适当的方法。
你能分享persistence.xml吗?检查事务类型上配置了什么