Spring Transaction:如果我不在方法上给出@Transaction注释,会发生什么

时间:2016-09-15 18:07:25

标签: java spring spring-mvc jpa transactions

我正在使用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
   }
 }

2 个答案:

答案 0 :(得分:1)

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

e.g

/*
     * (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);
        }
    }

答案 1 :(得分:1)

虽然Spring在DAO层自动添加@Transactional注释,但它不是正确的位置,也不是正确的行为。注释必须位于服务层,有一个已回答的问题here