2014-09-07 2 views
13

저는 현재 Hibernate와 함께 Spring Boot와 Spring Data (정확하게는 JpaRepository 인터페이스)를 사용하는 응용 프로그램을 작성 중입니다.봄 부팅 및 봄 데이터 : 최대 절전 세션은 어떻게 관리됩니까?

내가 Hiberante에 대해 좋아하는 한 가지 특징은 캐싱 기능입니다. 특정 개체와 일치하는 쿼리를 여러 개 제출하면 모든 쿼리 실행 (Java의 == 연산자와 관련하여)에서 해당 개체의 동일한 인스턴스가 반환됩니다. 그러나 스프링 데이터와 JpaRepository 클래스를 사용할 때 항상 그런 것은 아닙니다. 그런 이유로 여기에 여러 개의 HibernateSession 인스턴스가 있다고 가정합니다.

내 질문에 대한 답변 : Spring 데이터는 Hibernate 세션을 어떻게 처리합니까? 언제 열거 나 닫을까요? Hibernate의 객체 캐시를 최대한 활용하기 위해 애플리케이션의 전체 런타임에 대해 동일한 세션을 사용하도록 구성하는 방법이 있습니까? 그 이유가 이 아니고이 아니겠습니까?

감사합니다,

앨런

답변

19

는 내가 대답 자신을 발견했습니다 생각합니다. 누군가이 질문을 발견하면 여기 내 대답입니다.

Spring은 Hibernate 세션을 어떻게 관리합니까?

(또는 Repository 방법 일반적으로), 봄이됩니다 JpaRepository 방법을 호출 할 때 :

  • 가 호출 Repository 방법을 수행
  • 열기
  • 이 세션을 새 세션을 만들 수 SessionFactory 문의
  • 세션 닫기

스프링 @Transactional 주석을 사용하여 주석을 붙인 모든 메소드에 대해 동일한 결과가 나타나는 것으로 보입니다.

결과는 무엇입니까? 프로그래머로서

... 당신이 전혀 거래 나 세션으로 자신을 염려 할 필요가 없습니다

  • .
  • 당신은 Hibernate의 캐싱 기능에 의존 할 수 없다. 동일한 HibernateSession 내에서만 작동합니다.
  • @Entity 개체의 동등성을 Java의 == 연산자를 사용하는 대신 Hibernate ID 값으로 결정해야합니다.당신의 @Entity 클래스 (FetchMode.EAGER 반대로 FetchMode.LAZY 참조) (AN @OneToMany 참조 예를 들면) 게으른 컬렉션은 @Transactional -annotated 방법 참조 또한

내에서 독점적으로 사용되는

  • 당신은, 돌볼 필요 다음 링크는 매우 도움이되었습니다. Multiple Transactions in single session

    Spring의 다른 여러 측면과 마찬가지로, 애플리케이션에 대한 직접적인 제어를 희생하려는 경우 여기에서 많은 것을 얻을 수 있습니다.

  • +4

    사실 사실이 아닙니다 ... 거래 경계 설정에 따라 이미 열려있는 세션을 다시 사용하게됩니다. '@ Transactional' 주석이 붙은 서비스 메쏘드가 있다면 (그리고 tx 지원을 제대로 설정했다면) Spring은'Session' /'EntityManager'를 열고 트랜잭션 내에서 수행하는 모든 db 호출을 위해 그것을 재사용 할 것입니다. 또한 서비스 계층은 데이터 액세스 계층이 아닌 트랜잭션 계층이어야합니다. –

    +0

    설명해 주셔서 감사합니다. 이것은 잘 알고 있습니다. – Alan47