jpa javax.persistence.TransactionRequiredException: Executing an update/delete query

使用Spring data Jpa 注解方式修改数据遇到的异常

问题描述:在使用Spring data jpa @Query 注解执行 update 操作的时候遇到如下的异常

org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML operations [update com.study.jpa.pojo.SysUser u set u.userName = :userName where u.id = :id]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.errorIfDML(QueryTranslatorImpl.java:311) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:362) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1490) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1445) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1414) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.hibernate.query.internal.AbstractProducedQuery.getSingleResult(AbstractProducedQuery.java:1463) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]

相关 Repository 的代码如下所示:

    @Query(value = "update SysUser u set u.userName = :userName where u.id = :id")
    int changeUserName(@Param("id") Long id,@Param("userName") String userName);

百度查询了一下,Spring data jpa 在执行增删改的时候需要添加 @Modifying 注解,于是修改代码如下

    @Modifying
    @Query(value = "update SysUser u set u.userName = :userName where u.id = :id")
    int changeUserName(@Param("id") Long id,@Param("userName") String userName);

执行修改操作之后,依旧报异常但是异常信息已经改变如下

javax.persistence.TransactionRequiredException: Executing an update/delete query
    at org.hibernate.query.internal.AbstractProducedQuery.executeUpdate(AbstractProducedQuery.java:1496) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
    at org.springframework.data.jpa.repository.query.JpaQueryExecution$ModifyingExecution.doExecute(JpaQueryExecution.java:256) ~[spring-data-jpa-2.0.8.RELEASE.jar:2.0.8.RELEASE]
    at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:91) ~[spring-data-jpa-2.0.8.RELEASE.jar:2.0.8.RELEASE]
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:136) ~[spring-data-jpa-2.0.8.RELEASE.jar:2.0.8.RELEASE]
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:125) ~[spring-data-jpa-2.0.8.RELEASE.jar:2.0.8.RELEASE]

上面报了需要事务的异常,于是再次修改代码如下,添加 @Transactional 注解,程序正常,数据库信息修改成功。

    @Transactional
    @Modifying
    @Query(value = "update SysUser u set u.userName = :userName where u.id = :id")
    int changeUserName(@Param("id") Long id,@Param("userName") String userName);

猜你喜欢

转载自blog.csdn.net/weixin_37436596/article/details/80868108