Hibernate @本机查询的事务查询不起作用

Hibernate @本机查询的事务查询不起作用,hibernate,jpa,transactions,entitymanager,Hibernate,Jpa,Transactions,Entitymanager,考虑以下代码: class ClassOne { @Autowired ClassTwo classTwo; public void mainMethod() { Query query = em.createNativeQuery(...); classTwo.runTransaction(query); } } @Component class ClassTwo { @Transactional

考虑以下代码:

class ClassOne {
      @Autowired
      ClassTwo classTwo;

      public void mainMethod() {
          Query query = em.createNativeQuery(...);
          classTwo.runTransaction(query);
     }
}

@Component
class ClassTwo {
    @Transactional
    public void runTransaction(Query) {
        System.err.println(TransactionSynchronizationManager.isActualTransactionActive());
        query.executeUpdate();
    }
}
运行
main方法时,我遇到以下异常:

Executing an update/delete query javax.persistence.TransactionRequiredException: Executing an update/delete query
at org.hibernate.jpa.spi.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:71)
at sun.reflect.GeneratedMethodAccessor103.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.springframework.orm.jpa.SharedEntityManagerCreator$DeferredQueryInvocationHandler.invoke(SharedEntityManagerCreator.java:310)
at $Proxy55.executeUpdate(Unknown Source)
at ...ClassTwo.runTransaction(...)
at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:689)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:622)
at ...ClassOne.mainMethod(...)
我觉得奇怪的是,它对丢失的事务进行了比较,即使您可以在stacktrace中清楚地看到它通过了
TransactionInterceptor


另外,
isActualTransactionAlive
返回true。

您需要在事务上下文中获取查询对象。目前,它的外部事务上下文。它将解决您的问题。

您还应该在事务方法中创建查询。您不能在非事务性entitymanager上创建查询,然后神奇地期望它稍后参与事务。我刚刚发现了这一点。这让我有点惊讶,我发现了几个例子,它们说这应该是可能的。