java – Spring JPA存储库事务性
作者:互联网
关于Spring JPA存储库事务性的1个快速问题.
我有一个未标记为事务性的服务,并调用Spring JPA存储库方法
userRegistrationRepository.deleteByEmail(email);
它被定义为
@Repository
public interface UserRegistrationRepository extends JpaRepository<UserRegistration, Long> {
UserRegistration findByEmail(String email);
void deleteByEmail(String email);
}
问题是它失败了“没有实体事务可用于当前线程的EntityManager – 无法可靠地处理’删除’调用;嵌套异常是javax.persistence.TransactionRequiredException”异常.
好吧,我可以通过将服务或deleteByEmail(..)方法标记为事务来解决它,但我无法理解为什么它现在崩溃. Spring文档明确声明“默认情况下,存储库实例上的CRUD方法是事务性的”. (http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#transactions),但显然这个不是……那么这个陈述只与CrudRepository的成员有关吗?
ps:那是Spring Data JPA 1.9.4
解决方法:
你是对的.默认情况下,只有CRUD方法(CrudRepository方法)标记为事务性方法.
如果您使用自定义查询方法,则应使用@Transactional注释明确标记它.
@Repository
public interface UserRegistrationRepository extends JpaRepository<UserRegistration, Long> {
UserRegistration findByEmail(String email);
@Transactional
void deleteByEmail(String email);
}
您还应该了解标记存储库接口方法而不是服务方法的后果.如果您使用默认事务传播配置(Propagation.REQUIRED),那么:
The transaction configuration at the repositories will be neglected
then as the outer transaction configuration determines the actual one
used.
http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#transactions
如果您想了解有关它的实现方式的更多信息,请查看默认的CrudRepository / JpaRepository实现 – SimpleJpaRepository(您可能正在使用它):
有趣的线条在这里:
@Transactional(readOnly = true)
public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID> {
以及一些交易方法:
@Transactional
public void deleteById(ID id) {
@Transactional
public <S extends T> S save(S entity) {
标签:spring-transactions,java,spring-data,jpa 来源: https://codeday.me/bug/20190930/1836412.html