복붙노트

[SPRING] jpa / hibernate가있는 Spring에서 초기화 지연 예외를 피하기 위해 세션을 어떻게 열어 두어야합니까?

SPRING

jpa / hibernate가있는 Spring에서 초기화 지연 예외를 피하기 위해 세션을 어떻게 열어 두어야합니까?

나는 현재 Bean을 EntityManager로로드 한 후 콜렉션 특성에 액세스하려고 할 때 lazy 초기화 예외가 발생하지 않도록 엔티티 bean의 콜렉션을 열망한다.

대신 컬렉션을 지연로드로 남겨두면 세션을 열린 상태로 유지하려면 어떻게해야합니까? @Transactional을 시도해 볼까 생각 했었지만, 그 방법이 효과적 일지라도 긴 방법으로 트랜잭션을 열어 두는 것이 옳지 않기 때문에 그것을하고 싶지 않습니다.

해결법

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

    1.https://www.hibernate.org/43.html

    https://www.hibernate.org/43.html

    기본적으로 몇 가지 옵션이 있습니다.

    - 서버 측 로직이 시작될 때 세션을 열고 닫을 때 필터 / 인터셉터 / AOP 스타일 논리를 사용하여 세션을 열 때 "보기에서 열린 세션"패턴을 사용할 수 있습니다.

    - 여러 요청 - 응답주기에 걸쳐 대화를 구현할 수 있습니다.

    평범한 오래된 서블릿 필터가 가장 쉽습니다.

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

    2.누락 된 것으로 보이는 마지막 옵션은 JOIN을 사용하여 유스 케이스를 기반으로 객체 그래프를 작성할 수 있다는 것입니다.

    누락 된 것으로 보이는 마지막 옵션은 JOIN을 사용하여 유스 케이스를 기반으로 객체 그래프를 작성할 수 있다는 것입니다.

    그러면 개체가 초기화되고 즉 프록시가되지 않습니다.

    트랜잭션을 종료했기 때문에 세션이 닫힐 때 어떤 상태에 접촉했는지 알아야하기 때문에 클라이언트를 제어하고있는 경우 (즉 공개 API 게시를 작성하지 않은 경우)이 방법을 사용하십시오.

  3. ==============================

    3.다른 사람들이 말했듯이, "open session in view"패턴을 읽어야한다. 기본 아이디어는 http 요청을 처리하는 전체 기간 동안 최대 절전 모드 세션을 열어 놓는 것이다. hibernate specific과 spring solutions이 있습니다 - 저는 이전에 spring을 사용했고 잘 작동합니다.

    다른 사람들이 말했듯이, "open session in view"패턴을 읽어야한다. 기본 아이디어는 http 요청을 처리하는 전체 기간 동안 최대 절전 모드 세션을 열어 놓는 것이다. hibernate specific과 spring solutions이 있습니다 - 저는 이전에 spring을 사용했고 잘 작동합니다.

    질문에서 당신은 당신이 오랫동안 거래를 열지 않기를 원한다는 것을 언급합니다. 대부분의 사람들은 각 요청이 비교적 빨리 처리되기 때문에 이것은 문제가되지 않습니다. 그러나 귀하의 경우에 그것은 실제로 불가능한이 패턴은 당신을 위해 작동하지 않습니다. 거래를 계속 열지 않기를 원하는 이유에 대해 자세히 설명해 주시겠습니까?

  4. ==============================

    4.Spring의 HibernateTemplate을 사용하고 있습니까? 내가 믿는 당신을 위해 세션을 관리 할 것입니다. 또는, 만약 당신이 Hibernate 3.0.1 또는 그 상위에 있다면, Spring은 여전히 ​​당신을 위해 세션을 관리 할 수 ​​있어야한다.

    Spring의 HibernateTemplate을 사용하고 있습니까? 내가 믿는 당신을 위해 세션을 관리 할 것입니다. 또는, 만약 당신이 Hibernate 3.0.1 또는 그 상위에 있다면, Spring은 여전히 ​​당신을 위해 세션을 관리 할 수 ​​있어야한다.

    이 설정 방법을 설명하는 SpringSource 블로그 항목이 있습니다. 아래에 추출물을 포함 시켰습니다.

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <!– the works –>
    </bean>
    <bean id="accountRepo" class="com.mycompany.HibernateAccountRepository">
      <constructor-arg ref="sessionFactory"/>
    </bean>
    
    @Repository // from org.springframework.stereotype
    public class HibernateAccountRepository implements AccountRepository {
        // see above for full impl…
    }
    
  5. ==============================

    5.일부 데이터를 읽은 세션을 열어두면 해당 트랜잭션을 열어 두십시오. 장기 실행 트랜잭션은 문제가 크지 않지만 (실제로는 데이터베이스에 따라 다를 수 있음) 실제로 문제를 일으키는 것은 오랫동안 잠금이 유지되지만 실제로 데이터베이스에서 데이터를 변경하면 생성됩니다. 다시 이것은 데이터베이스에 따라 다릅니다.

    일부 데이터를 읽은 세션을 열어두면 해당 트랜잭션을 열어 두십시오. 장기 실행 트랜잭션은 문제가 크지 않지만 (실제로는 데이터베이스에 따라 다를 수 있음) 실제로 문제를 일으키는 것은 오랫동안 잠금이 유지되지만 실제로 데이터베이스에서 데이터를 변경하면 생성됩니다. 다시 이것은 데이터베이스에 따라 다릅니다.

  6. ==============================

    6.이제, 저는 Spring을 사용하지 않았지만 여러 다른 프로젝트에서 Hibernate를 사용했습니다. 가장 최근의 프로젝트를 위해 내가 접근 한 접근 방식은 (서블릿 필터와 함께) Defensive Session Handling 패턴에서 비롯되었으며, 우리는 그것에 만족하고 있습니다. 여기에서 더 많은 디자인 패턴을 찾을 수 있습니다.

    이제, 저는 Spring을 사용하지 않았지만 여러 다른 프로젝트에서 Hibernate를 사용했습니다. 가장 최근의 프로젝트를 위해 내가 접근 한 접근 방식은 (서블릿 필터와 함께) Defensive Session Handling 패턴에서 비롯되었으며, 우리는 그것에 만족하고 있습니다. 여기에서 더 많은 디자인 패턴을 찾을 수 있습니다.

  7. from https://stackoverflow.com/questions/1139985/in-spring-with-jpa-hibernate-how-do-i-keep-a-session-open-to-avoid-lazy-initial by cc-by-sa and MIT license