복붙노트

[SPRING] 어떻게 Hibernate에서 현재 세션에 영향을 @Transactional합니까?

SPRING

어떻게 Hibernate에서 현재 세션에 영향을 @Transactional합니까?

이것은 대부분의 DAO에서 사용되는 일반적인 설정입니다 :

@Transactional
@Repository
public class DAO {

   @Autowired
   SessionFactory sessionFactory;

   public void save(Entity o) {
       sessionFactory.getCurrentSession().save(o);
   }

   public Entity load(int id) {
       return (Entity)sessionFactory.getCurrentSession().get(Entity.class, id);
   }

}

나는 전화에만 getCurrentSession (), 아니 OpenSession에 또는 닫기를 참조하십시오.

내가 부하에서 개체를 반환 할 때 그래서 세션에없는, 게으른 컬렉션을로드 할 수 없습니다. 이와 유사하게 보인다 저장 항상 세척합니다!

스프링에서 @Transactional 어노테이션은 모두 그 자체로 개폐 세션 및 트랜잭션의 마법을합니까?

해결법

  1. ==============================

    1.봄에서 @Transactional에 의해 경계가 비즈니스 트랜잭션 및 최대 절전 모드 세션 사이에 일대일 대응이 있습니다.

    봄에서 @Transactional에 의해 경계가 비즈니스 트랜잭션 및 최대 절전 모드 세션 사이에 일대일 대응이 있습니다.

    즉, 절전 세션이 생성된다 (세션이 처음 사용까지 TransactionManager를 실제 생성을 지연시킬 수있다) 비즈니스 트랜잭션이 @Transactional 메소드를 호출하는 것으로 시작하면,이다. 메소드가 완료되면, 비즈니스 트랜잭션은 최대 절전 모드 세션을 종료하는, 다시 커밋 또는 롤백됩니다.

    귀하의 경우, 이것은 DAO 방식 (트랜잭션이 이미 진행중인 경우를 제외하고) 새로운 트랜잭션을 시작하는 DAO 메소드를 호출하고 종료하는 것은 또한 그것을 플러시 최대 절전 모드 세션을 종료하는, 그것을 끝낼 것을 의미하고, 커밋 또는 롤백 다시 차례로 커밋 또는 해당 JDBC 트랜잭션을 롤백 대응하는 최대 절전 모드 거래.

    이되는 일반적인 사용에 관해서는, 최대 절전 모드 사용 설명서는이 세션 당 동작을 방지 패턴을 호출합니다. 마찬가지로, 봄 참조 설명서에서 @Transactional의 예는 비즈니스 서비스 메소드 (또는 클래스)이 아닌 저장소에 배치됩니다.

  2. ==============================

    2.봄 @Transactional 주석되는 콩에 거래 조언을 제공합니다. Spring 트랜잭션은 트랜잭션의 동작을 결정 육 개의 속성을 다음에 대한 지원을 제공합니다

    봄 @Transactional 주석되는 콩에 거래 조언을 제공합니다. Spring 트랜잭션은 트랜잭션의 동작을 결정 육 개의 속성을 다음에 대한 지원을 제공합니다

    1.isolation, 2.no 롤백-를 들어, 3.propagation, 4.read 전용 5.rollback-에, 6.timeout.

    @Transactional는 새 트랜잭션을 시작할 수 있습니다 또는 트랜잭션 컨텍스트가 전파 속성 값을 기반으로 기존 가입 할 수 있습니다.

    @Transactionalcontext에서, getCurrentSession () 메소드가 존재하지 않을 경우 새로운 세션 객체를 생성하거나 현재의 트랜잭션 (transaction)에 연결된 세션을 반환합니다. OpenSession에 () 메소드는 항상 새로운 세션을 생성합니다. @Transactional는 세션의 범위를 확장하는 데 도움이됩니다.

    세션 getCurrentSession ()가 실행되고, 트랜잭션이 종료 할 때 닫히고 트랜잭션을 커밋하기 전에 플러시 개방 처음이다.

    우리가 비 트랜잭션 컨텍스트에서 getCurrentSession ()를 사용하는 경우 봄, 우리는 예외를 얻을.

  3. from https://stackoverflow.com/questions/24710620/how-does-transactional-influence-current-session-in-hibernate by cc-by-sa and MIT license