Ответ 1
Я использую Spring 3.1 и Spring JPA Data. У меня была аналогичная проблема. Я постоянно получал ошибку при попытке обновить несколько записей в 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, я узнал, что вам нужно добавить @Modification.
@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
...
Итак, я понял, что проблема теперь была проблемой транзакций, и я вернулся в Google, чтобы исследовать ее и выяснил, что теперь вы должны добавить @Transactional. Похоже, что @Modification также требует @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"/>
Это было долгое путешествие, но я, наконец, получил его работу. Я надеюсь, что это поможет кому-то, пытаясь "оплатить его", поскольку многие другие помогли мне с их замечательными блогами, ответами и комментариями.