Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在JpaRepository上运行自定义更新查询?(TransactionRequiredException)_Java_Sql_Hibernate_Jpa_Jpql - Fatal编程技术网

Java 如何在JpaRepository上运行自定义更新查询?(TransactionRequiredException)

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 " +

我试图在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 " +
                "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吗?检查事务类型上配置了什么