복붙노트

[SPRING] org.hibernate.LazyInitializationException : 프록시를 초기화 할 수 없습니다 - 세션 없음, 프레임 없음

SPRING

org.hibernate.LazyInitializationException : 프록시를 초기화 할 수 없습니다 - 세션 없음, 프레임 없음

Foo look은 이걸 가지고 있습니다 :

@ManyToMany
private Set<User> favouritedBy;

사용자가 가지고있는 동안 :

@ManyToMany(mappedBy = "favouritedBy")
private Set<Foo> favourites  = new HashSet<Foo>();
public Set<Foo> getFavourites() {
  return favourite;
}

그리고 fooService는 tranactional 메서드를 통해 세션이 열리는 동안 lazyloaded 컬렉션에 액세스하면서이 작업을 수행합니다.

@Transactional(readOnly = true)
public Set<Foo> getFavourites(User user) {
user = dao.get(User.class, user.getId()); //the dao gets a session
Set<Foo> favourites = user.getFavourites();//but the session is not here and the exception is thrown?
return  favourties;
}

편집하다 기준을 사용하지 않고이를 수정합니다.

Set<Foo> favourites = new HashSet<Foo>(user.getFavourites());

이것은 기준으로 해결합니다.

Session session = sessionFactory.getCurrentSession();
final Criteria crit = session.createCriteria(Foo.class);
crit.setFetchMode("favourites", FetchMode.JOIN);
crit.add(Property.forName("id").eq(id));
return (Foo) crit.uniqueResult();

해결법

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

    1.ManyToMany의 기본 FetchType은 LAZY이고 지연 연결을 사용하기위한 최대 절전 모드 설명서는 이러한 종류의 액세스를 오류로 명확하게 호출합니다. 세션이 아직 열려있는 동안에 만 lazy 연관된 객체와 상호 작용할 수 있습니다. 문서의 해당 부분은 또한 지연된 관련 객체 구성원에 액세스하는 대안을 제공합니다. 우리는 사용 된 기준, 우리의 응용 프로그램에서 가져 오기 모드를 JOIN으로 지정하는 것을 선호합니다

    ManyToMany의 기본 FetchType은 LAZY이고 지연 연결을 사용하기위한 최대 절전 모드 설명서는 이러한 종류의 액세스를 오류로 명확하게 호출합니다. 세션이 아직 열려있는 동안에 만 lazy 연관된 객체와 상호 작용할 수 있습니다. 문서의 해당 부분은 또한 지연된 관련 객체 구성원에 액세스하는 대안을 제공합니다. 우리는 사용 된 기준, 우리의 응용 프로그램에서 가져 오기 모드를 JOIN으로 지정하는 것을 선호합니다

    편집하다:

    Set<Foo> favourites = user.getFavourites();
    

    위의 명령문은 실제로 모든 Foo 오브젝트를 포함하는 세트를 리턴하지 않습니다. 단지 프록시 일뿐입니다. 실제 Foo 객체는 집합의 요소에 favorite.iterator () 등처럼 액세스 할 때만 가져옵니다.이 작업은 getFavorites () 메서드 외부에서 분명히 발생합니다. 그러나 getFavorites () 메소드의 @Transactional 주석은 세션이이 메소드의 끝에서 닫힐 것임을 나타냅니다.

    따라서 메서드가 즐겨 찾기 집합에서 호출되면 세션이 이미 닫혀 있으므로 예외가 발생합니다.

    이 문제를 해결하려면 Criteria 객체를 사용하여 사용자를 검색하고 반입 유형을 JOIN으로 지정하여 Foo 객체가 반환 된 User 객체에 채워지도록해야합니다.

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

    2.두 가지 해결책이 있습니다.

    두 가지 해결책이 있습니다.

    mySessionFactory 는 applicationContext.xml에 정의 된 sessionFacory 빈 이름입니다.

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

    3.예, 객체는 다국적 환경에서 액세스해야합니다. 그렇지 않으면 LazyInitializationException이 발생합니다.

    예, 객체는 다국적 환경에서 액세스해야합니다. 그렇지 않으면 LazyInitializationException이 발생합니다.

  4. from https://stackoverflow.com/questions/13671178/org-hibernate-lazyinitializationexception-could-not-initialize-proxy-no-sessi by cc-by-sa and MIT license