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