2014-01-30 1 views
1

클래스 수준에서 @Transactional으로 표시된 기본 Dao 클래스가있는 경우 Dao의 모든 호출이 자체 트랜잭션에서 실행됩니다.기존 트랜잭션 방식에 대한 트랜잭션을 래핑 하시겠습니까?

다른 DA 방법에 대한 호출을 여러 번 사용하는 어딘가에서 메서드를 만드는 경우 어떻게해야합니까? 이러한 각각의 호출은 자체 트랜잭션에서 실행됩니까, 아니면 트랜잭션이 래핑됩니까?

@Service 
@Transactional 
class BaseDao<T> { 
    //each of these methods will run in a transaction 
    public void save(T entity) { } 
    public void update(T entity) { } 
} 

@Service 
class PersonFacade() { 
    //will this "wrapp" the transaction? 
    @Transactional 
    void update() { 
     dao.find(); 
     dao.update(); 
    } 
} 

가 포장되어있는 경우, 다음 그것을 DAO는 CRUD 작업을 관리 할 수 ​​@Autowired BaseDao<Person>로 직접 사용될 수 있도록, 일반 DAO 클래스에 @Transactional 주석을 갖는 좋은 방법이라고 생각? 그리고 필요한 경우에만 단일 트랜잭션 내에서 실행해야하는 여러 번의 분주 한 전화를 마무리하는 외벽을 만듭니다.

아니면 기본 dao에서 트랜잭션을 제거해야합니까?

답변

1

@Transactional이라고 표시된 메소드에 두 호출을 모두 래핑하면 모든 트랜잭션을 스패닝하는 트랜잭션이 하나만 생깁니다.

DAO 클래스에는 @Transactional 어노테이션이 없어야한다고 생각합니다. 이들을 "비즈니스 방법"을 제공하는 Service 클래스에 넣으십시오. DAO 메소드가 어떤 엔티티 (가능하면 여러 엔티티)를 호출하여 의미있는 트랜잭션으로 구성되는지 알 수 있습니다.

도 참조 Where does the @Transactional annotation belong?

관련 문제