2017-05-21 89 views
0

Error: javax.persistence.TransactionRequiredException: Executing an update/delete query與查詢春季數據的方法

更改值根據信息庫接口創建alteção的方法,有必要指定@Modifying

註釋但繼續犯同樣的錯誤文檔https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.modifying-queries。查看文檔https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#transactional-query-methods它說,如果我想讓存儲庫接口的方法成爲事務性的,只需指定@Transaction註釋。

但同樣的錯誤仍然發生

服務

import javax.transaction.Transactional; 

@Stateless 
@Transactional 
public class UsuarioService { 

    @Inject 
    private IRepositorioUsuario usuarioRepositorio; 

    public void updateRedifinirSenha(Long codigoPessoa, String senha) { 
     usuarioRepositorio.updateRedifinirSenha(codigoPessoa, senha); 
    } 
} 

import javax.transaction.Transactional; 

@Repository 
public interface IRepositorioUsuario extends JpaRepository<Usuario, Long> { 

    @Modifying 
    @Transactional 
    @Query("update Usuario u set u.senha = :senha where u.codigoPessoa = :codigoPessoa") 
    void updateRedifinirSenha(@Param("codigoPessoa") Long codigoPessoa, @Param("senha") String senha); 
} 

獲取持久化上下文

規格:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpd.misc.cdi-integration

public class CdiConfig { 

    @Produces 
    @Dependent 
    @PersistenceContext(unitName = "sgr-pu") 
    public EntityManager entityManager; 
} 

我改變了交易的包org.springframework.transaction.annotation.Transactional的交易,但例外的是一樣的。

我在Java EE項目中使用了Spring Data模塊。

原因通過錯誤

Caused by: javax.persistence.TransactionRequiredException: Executing an update/delete query 
    at org.hibernate.jpa.spi.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:54) 
    at org.jboss.as.jpa.container.QueryNonTxInvocationDetacher.executeUpdate(QueryNonTxInvocationDetacher.java:80) 
    at org.springframework.data.jpa.repository.query.JpaQueryExecution$ModifyingExecution.doExecute(JpaQueryExecution.java:242) 
    at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:82) 
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:116) 
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:106) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:482) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:460) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:61) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:133) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) 
    at com.sun.proxy.$Proxy561.updateRedifinirSenha(Unknown Source) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.jboss.weld.bean.proxy.AbstractBeanInstance.invoke(AbstractBeanInstance.java:38) 
    at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:100) 
    at com.sgr.repositorio.IRepositorioUsuario$JpaRepository$570520021$Proxy$_$$_WeldClientProxy.updateRedifinirSenha(Unknown Source) 
    at com.sgr.service.UsuarioService.updateRedifinirSenha(UsuarioService.java:58) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.jboss.as.ee.component.ManagedReferenceMethodInterceptor.processInvocation(ManagedReferenceMethodInterceptor.java:52) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.invocation.InterceptorContext$Invocation.proceed(InterceptorContext.java:437) 
    at org.jboss.as.weld.ejb.DelegatingInterceptorInvocationContext.proceed(DelegatingInterceptorInvocationContext.java:87) 
    at org.jboss.weld.interceptor.proxy.WeldInvocationContext.interceptorChainCompleted(WeldInvocationContext.java:98) 
    at org.jboss.weld.interceptor.proxy.WeldInvocationContext.proceed(WeldInvocationContext.java:117) 
    at com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorBase.invokeInCallerTx(TransactionalInterceptorBase.java:129) 
    at com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorRequired.doIntercept(TransactionalInterceptorRequired.java:55) 
    at com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorBase.intercept(TransactionalInterceptorBase.java:76) 
    at com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorRequired.intercept(TransactionalInterceptorRequired.java:47) 
    at sun.reflect.GeneratedMethodAccessor376.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.jboss.weld.interceptor.reader.SimpleInterceptorInvocation$SimpleMethodInvocation.invoke(SimpleInterceptorInvocation.java:74) 
    at org.jboss.weld.interceptor.proxy.WeldInvocationContext.invokeNext(WeldInvocationContext.java:83) 
    at org.jboss.weld.interceptor.proxy.WeldInvocationContext.proceed(WeldInvocationContext.java:115) 
    at org.jboss.weld.bean.InterceptorImpl.intercept(InterceptorImpl.java:108) 
    at org.jboss.as.weld.ejb.DelegatingInterceptorInvocationContext.proceed(DelegatingInterceptorInvocationContext.java:77) 
    at org.jboss.as.weld.ejb.Jsr299BindingsInterceptor.delegateInterception(Jsr299BindingsInterceptor.java:68) 
    at org.jboss.as.weld.ejb.Jsr299BindingsInterceptor.doMethodInterception(Jsr299BindingsInterceptor.java:80) 
    at org.jboss.as.weld.ejb.Jsr299BindingsInterceptor.processInvocation(Jsr299BindingsInterceptor.java:93) 
    at org.jboss.as.ee.component.interceptors.UserInterceptorFactory$1.processInvocation(UserInterceptorFactory.java:63) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.as.ejb3.component.invocationmetrics.ExecutionTimeInterceptor.processInvocation(ExecutionTimeInterceptor.java:43) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.as.jpa.interceptor.SBInvocationInterceptor.processInvocation(SBInvocationInterceptor.java:47) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.invocation.InterceptorContext$Invocation.proceed(InterceptorContext.java:437) 
    at org.jboss.weld.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:64) 
    at org.jboss.as.weld.ejb.EjbRequestScopeActivationInterceptor.processInvocation(EjbRequestScopeActivationInterceptor.java:83) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.as.ee.concurrent.ConcurrentContextInterceptor.processInvocation(ConcurrentContextInterceptor.java:45) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.invocation.InitialInterceptor.processInvocation(InitialInterceptor.java:21) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61) 
    at org.jboss.as.ee.component.interceptors.ComponentDispatcherInterceptor.processInvocation(ComponentDispatcherInterceptor.java:52) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.as.ejb3.component.pool.PooledInstanceInterceptor.processInvocation(PooledInstanceInterceptor.java:51) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:275) 
    ... 141 more 
+0

假設你嘗試加入'@Modifying(clearAutomatically =真)'在更新查詢。這[後](http://stackoverflow.com/questions/22533399/why-do-i-not-see-changes-issued-through-an-update-query-with-spring-data-jpa)解釋更多關於這個。 –

+0

感謝@Rajith Pemabandu我將clearAutomatically添加爲true,但發生了相同的異常。 – EdeGerSil

+0

你能提供你如何配置你的數據源,實體管理器,事務管理器等? –

回答

0

我解決我的問題如下。聲明一個DAO並執行一個hql來更新。在以下帖子Why do I not see changes issued through an update query with Spring Data JPA?左邊@Rajith Pemabandu@Oliver Gierke有迴應,指出這些類型的方法適用於批量更改。所以基本上我打破了發展模式。 但是如果有人知道錯誤的原因,請在這裏分享,我會致力於找出原因,但現在我正在使用下面的解決方案。謝謝!

解決方案

public class UsuarioDAO { 

    @PersistenceContext 
    public EntityManager entityManager; 

    public void redifinirSenha(Long codigoPessoa, String senha) { 
     Query query = entityManager.unwrap(Session.class).createQuery("update Usuario u set u.senha = :senha where u.codigoPessoa = :codigoPessoa"); 
     query.setLong("codigoPessoa", codigoPessoa); 
     query.setString("senha", senha); 
     query.executeUpdate(); 
    } 
} 
+0

您提到「以下帖子」,但您不包含鏈接或任何內容。 –

+0

真的錯過了帖子中的鏈接。我編輯了我的答案。感謝@Jeans Schauder提醒 – EdeGerSil