春季交易:如果我不对方法进行@Transaction注释,会发生什么

2022-09-03 15:35:51

我正在使用Spring-Boot,Spring Rest Controller和Spring Data JPA。如果我没有指定@Transaction那么也记录get的创建,但我想了解它是如何发生的。我的理解是,Spring默认添加具有默认参数的事务,但不确定它在哪里添加服务层还是在存储库中添加。

 public interface CustomerRepository extends CrudRepository<Customer, Long> {

    List<Customer> findByLastName(String lastName);
 }

 @Service
 public class CustomerServiceImpl implements CustomerService> {

   List<Customer> findByLastName(String lastName){
     //read operation
    }

 // What will happen if @Transaction is missing. How record get's created without the annotation
  public Customer insert(Customer customer){
  // insert operations
   }
 }

答案 1

Spring Data JPA 在 Repository 层添加了@Transactional注释,特别是在 SimpleJpaRepository 类中。这是为所有 Spring Data JPA 存储库扩展的基本 Repository 类。

例如

/*
     * (non-Javadoc)
     * @see org.springframework.data.repository.CrudRepository#save(java.lang.Object)
     */
    @Transactional
    public <S extends T> S save(S entity) {

        if (entityInformation.isNew(entity)) {
            em.persist(entity);
            return entity;
        } else {
            return em.merge(entity);
        }
    }

答案 2

虽然Spring会自动在DAO层添加注释,但它不是正确的地方,也不是正确的行为。注记必须位于服务图层,这里有一个问题的答案。@Transactional


推荐