Spring Data Jpa javax.persistence. TransactionExceptionRedException:执行更新/删除查询:Sping Boot 2.7.5

lxkprmvk  于 2024-01-09  发布在  Spring
关注(0)|答案(1)|浏览(278)

我有下面的错误,而试图做一个update使用Spring Boot 2.7.5 .我已经尝试了不同的方法建议在不同的地方,但仍然得到相同的问题.有一个问题,关于这一点为spring-boot.1.2.5.RELASE在此page .我想知道如果同样的情况发生与Spring Boot 2.7.5 .下面是我的代码:

  1. import org.springframework.transaction.annotation.Transactional;
  2. @Repository
  3. public interface PersonRepo extends CrudRepository<Person, String> {
  4. @Modifying
  5. @Transactional
  6. @Query(value = "UPDATE PERSON SET STATUS = 'ACTIVE' WHERE STATUS = :status", nativeQuery = true)
  7. void updatePersonStatusToActive(@Param("status") String status);
  8. }

字符串
我也试过把@Transactional放在@Repository下面的接口级别,同样的问题。

Stacktrace:

  1. Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query
  2. at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:403)
  3. at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:235)
  4. at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:551)
  5. at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)
  6. at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242)
  7. at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:152)
  8. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
  9. at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:145)
  10. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
  11. at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)
  12. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
  13. at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215)
  14. at com.sun.proxy.$Proxy113.updatePersonStatusToActive(Unknown Source)
  15. at com.people.PeopleApplication.processPerson(PeopleApplication.java:304)
  16. at com.people.PeopleApplication.run(PeopleApplication.java:205)
  17. at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:771)
  18. ... 5 common frames omitted
  19. Caused by: javax.persistence.TransactionRequiredException: Executing an update/delete query
  20. at org.hibernate.internal.AbstractSharedSessionContract.checkTransactionNeededForUpdateOperation(AbstractSharedSessionContract.java:445)
  21. at org.hibernate.query.internal.AbstractProducedQuery.executeUpdate(AbstractProducedQuery.java:1692)
  22. at org.springframework.data.jpa.repository.query.JpaQueryExecution$ModifyingExecution.doExecute(JpaQueryExecution.java:241)
  23. at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:90)
  24. at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:156)
  25. at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:144)
  26. at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:137)
  27. at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:121)
  28. at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:160)
  29. at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:139)
  30. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
  31. at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123)
  32. at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388)
  33. at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)
  34. at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
  35. at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137)
  36. ... 15 common frames omitted

Person.java

  1. @Entity
  2. @Table(schema = "APP_OWNER", name = "PERSON")
  3. @Data
  4. public class Person {
  5. @Id
  6. @Column(name = "PERSON_ID")
  7. private String personId;
  8. @Column(name = "FULL_NAME")
  9. private String fullName;
  10. @Column(name = "ADDRESS")
  11. private String address;
  12. @Column(name = "STATUS")
  13. private String status;
  14. @Column(name = "CREATED_DATE")
  15. private Date createdDate;
  16. }

fae0ux8s

fae0ux8s1#

这有点棘手,因为您没有添加任何生成此错误消息的代码。
您可以尝试使用以下命令进行调试:
1.尝试使用@EnableJpaRepositories@EnableTransactionManagement添加JPA存储库和事务管理,看看是否有任何不同。类似于:

  1. @SpringBootApplication
  2. @EnableJpaRepositories
  3. @EnableTransactionManagement
  4. public class MyApplication {
  5. public static void main(String[] args) {
  6. SpringApplication.run(MyApplication.class, args);
  7. }
  8. }

字符串
1.使用Spring接口进行更新有时会出现问题,这可能会导致transaction annotations无法处理。尝试通过Service类执行update操作,而不是直接在main class或其他组件中执行,示例如下:

  1. @Service
  2. public class PersonService {
  3. @Autowired
  4. private PersonRepo personRepo;
  5. @Transactional
  6. public void updatePersonStatusToActive(String status) {
  7. personRepo.updatePersonStatusToActive(status);
  8. }
  9. }


1.您还可以添加事务日志记录,以便更好地了解根本原因logging.level.org.springframework.transaction=DEBUG

展开查看全部

相关问题