2017-05-21 1 views
0

Error: javax.persistence.TransactionRequiredException: Executing an update/delete queryÄndern von Werten mit Abfrage Spring Data Methoden

Gemäß der Dokumentation https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.modifying-queries die Methode der alteção in einer Repository-Schnittstelle zu schaffen ist es notwendig, weiterhin die Anmerkung @Modifying

aber den gleichen Fehler zu spezifizieren. Mit Blick auf die Dokumentation https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#transactional-query-methods heißt es, wenn ich zulassen möchte, dass die Methoden der Repository-Schnittstelle transaktional sind, geben Sie einfach die @Transaction Annotation an.

Aber der gleiche Fehler auftritt, noch

Dienst

import javax.transaction.Transactional; 

@Stateless 
@Transactional 
public class UsuarioService { 

    @Inject 
    private IRepositorioUsuario usuarioRepositorio; 

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

Repository

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); 
} 

Erste Persistenzkontext

Spec: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; 
} 

änderte ich den Transactional auf die Transaktion des Pakets org.springframework.transaction.annotation.Transactional, aber die Ausnahme ist das gleiche.

Ich verwende das Spring Data-Modul in einem Java EE-Projekt.

Ursache von Fehler

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

nehme an, Sie versuchen, mit dem Hinzufügen von '@Modifying (clearAutomatically = true)' in Ihrer Update-Abfrage. diese [post] (http://stackoverflow.com/questions/22533399/why-doi-i-not-se-changes-issued-through-an-update-query-with-spring-data-jpa) erklärt mehr über Dies. –

+0

Danke @Rajith Pemabandu Ich habe clearAutomatisch True hinzugefügt, aber die gleiche Ausnahme aufgetreten. – EdeGerSil

+0

Können Sie angeben, wie Sie Ihre Datenquelle, den Entity Manager, den Transaktionsmanager usw. konfigurieren? –

Antwort

0

löste ich mein Problem wie folgt. Deklarieren eines DAO und Ausführen eines zu aktualisierenden HQLs In dem folgenden Beitrag Why do I not see changes issued through an update query with Spring Data JPA? links von @Rajith Pemabandu gibt es eine Antwort von @Oliver Gierke, die besagt, dass diese Arten von Methoden für Massenänderungen geeignet sind. Im Grunde genommen habe ich das Entwicklungsmuster gebrochen. Aber wenn jemand den Grund für den Fehler kennt, teilen Sie hier, ich werde mich widmen, um den Grund herauszufinden, aber für jetzt verwende ich diese Lösung unten. Vielen Dank!

Lösung

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

Sie erwähnen "den folgenden Beitrag", aber Sie enthalten keinen Link oder irgendetwas. –

+0

Wirklich fehlt der Link in der Post.Ich habe meine Antwort bearbeitet. Danke für die Warnung @Jeans Schauder – EdeGerSil

Verwandte Themen