我使用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