我使用Spring 3.1和Spring JPA数据。我遇到了类似的问题。在尝试更新1个查询中的多个记录时,我经常发生错误。
所以,我有这样的事情。
@Query("UPDATE User u SET u.state = ?1 WHERE u.server.id = ?2")
public void updateAllUsers(long state, long serverid);
错误:
org.hibernate.hql.QueryExecutionRequestException: Not supported for DML operations
所以,google搜索了一会儿后,我发现,你必须增加@Modifying。
@Modifying
@Query("UPDATE User u SET u.state = ?1 WHERE u.server.id = ?2")
public void updateAllUsers(long state, long serverid);
但后来我发现了以下错误:
...
nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query;
nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query
...
所以,我想我的问题是现在交易的问题,我又回到了谷歌研究,结果发现了,你必须现在添加@Transactional。看起来@修饰也需要@Transactional。
@Modifying
@Transactional
@Query("UPDATE User u SET u.state = ?1 WHERE u.server.id = ?2")
public void updateAllUsers(long state, long serverid);
但后来我得到了以下错误:
No value for key [org.apache.commons.dbcp.BasicDataSource (...) ] bound to thread
再次我GOOGLE了一段时间,得出的结论,我的配置是错误的,它被证明是真实的。我错过了一些XML配置。
<beans:bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager">
<beans:property name="entityManagerFactory" ref="entityManagerFactory"/>
</beans:bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
这是漫长的旅程,但我终于得到它的工作。我希望这会帮助别人,试图“付出代价”,因为其他许多人用他们美妙的博客,答案和评论帮助我。
也确保注解是从org.springframework.transaction.annotation中导入的,而不是javax – barryku 2014-09-23 22:04:14
我在Spring JPA存储库中使用与以下类完全相同的配置,但在创建bean时出错。 (不是一个特定的错误,它只是说存储库不能创建)。为什么会这样? '@Repository 接口IContactRepository延伸PagingAndSortingRepository <接触,龙> { \t @Modifying \t @Query( “从触点c删除其中c.circle.id =:circleId”) \t空隙deleteAllMembersOf(@Param( “circleId”)Long circleId); }' – noego 2015-03-03 23:07:25