Spring3.1とSpringJPADataを使用しています。私も同様の問題を抱えていました。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
それで、しばらくグーグルした後、@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を追加しなければならないことを知りました。@Modifyingにも@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
もう一度グーグルでしばらく検索したところ、設定が間違っていて、それが正しいことが判明したという結論に達しました。いくつかの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"/>
長い道のりでしたが、ようやくうまくいきました。他の多くの人が素晴らしいブログ、回答、コメントで私を助けてくれたので、これが誰かに「恩返し」をしようとして役立つことを願っています。