복붙노트

[SPRING] 프록시를 초기화 할 수 없습니다 - 세션 없음

SPRING

프록시를 초기화 할 수 없습니다 - 세션 없음

다음과 같은 오류가 발생했습니다.

나는 자바, 최대 절전 모드 및 스프링과 함께 일하고있다. 이 오류는 PDF 문서를 생성 할 때 발생하며, 다음 단계에 따라 데이터베이스를 즉시 생성하고 데이터베이스에 저장합니다.

이 오류는 "프록시를 초기화 할 수 없습니다 - 세션 없음"오류로 인해 쿼리를 실행할 수 없음을 보여줍니다.

동일한 사용자 세션에서 동일한 방법을 두 번 호출하여 내가 잘못하고있는 것이 있습니까? 두 요청이 모두 완료되기 전에 세션이 닫혔습니까?

누군가가 내가 무슨 일이 일어나고 있는지 이해할 수 있기를 바랍니다.

해결법

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

    1.문제는 최대 절전 모드 세션은 하나의 요청에 대해서만 존재한다는 것입니다. 요청 시작시 열리고 끝나면 닫힙니다. 당신은 대답을 추측했다. 두 요청이 모두 끝나기 전에 최대 절전 모드 세션이 닫힌다.

    문제는 최대 절전 모드 세션은 하나의 요청에 대해서만 존재한다는 것입니다. 요청 시작시 열리고 끝나면 닫힙니다. 당신은 대답을 추측했다. 두 요청이 모두 끝나기 전에 최대 절전 모드 세션이 닫힌다.

    정확히 무슨 일이 일어나고있는거야? 엔티티 객체는 두 요청 중에 모두 실행됩니다. 방법? 그것들은 HTTP 세션에 저장됩니다 (이것은 세션이라고 불리는 다른 것입니다). 사용하고있는 프레임 워크에 대해 많은 정보를 제공하지 않기 때문에 더 자세한 정보를 제공 할 수는 없지만, 사용하고있는 프레임 워크 어떻게 든 엔티티는 HTTP 세션을 유지합니다. 이것은 프레임 워크가 하나 이상의 요청에 대해 동일한 객체로 작업하는 것을 쉽게 만드는 방법입니다.

    두 번째 요청의 처리가 시작되면 코드는 최대 절전 모드로 지연 초기화 된 일부 엔터티 (일반적으로 컬렉션 요소)에 액세스하려고합니다. 엔티티는 Hibernate 세션에 연결되어 있지 않으므로, hibernate는 그것을 읽기 전에 최대 절전 모드 프록시를 초기화 할 수 없다. Ajax 요청 처리를 시작할 때 세션을 열고 엔터티를 다시 연결해야합니다.

    편집하다:

    나는 그 장면 뒤에 무엇이 일어나고 있는지 간단히 설명하려고 노력할 것이다. 모든 자바 웹 프레임 워크는 요청을 처리하는 하나 이상의 서블릿을 가지고있다. 서블릿은 최종적으로 응답을 생성하는 새로운 스레드 (HttpResponse)를 생성하여 각 요청 (HttpRequest)을 처리합니다. 각 요청을 처리하는 메소드는이 스레드 내에서 실행됩니다.

    요청 처리의 시작 부분에서 응용 프로그램은 처리 (트랜잭션, 최대 절전 세션 등)에 필요한 자원을 할당해야합니다. 처리주기가 끝나면 이러한 자원이 해제됩니다 (트랜잭션은 커밋되고 최대 절전 세션은 닫히고 JDBC 연결은 해제됩니다). 이러한 리소스의 수명주기는 프레임 워크에서 관리하거나 코드로 수행 할 수 있습니다.

    HTTP와 같은 상태 비 저장 프로토콜에서 애플리케이션 상태를 지원하기 위해 HttpSession 객체가있다. 우리 (또는 프레임 워크)는 HttpSession을 사용하여 동일한 클라이언트의 서로 다른 요청주기간에 관련된 정보를 유지합니다.

    첫 번째 요청을 처리하는 동안 hibernate는 데이터베이스에서 엔티티를 읽습니다 (느슨하게). 게으른 초기화로 인해이 객체의 구조 중 일부는 최대 절전 프록시 객체입니다. 이 객체들은 그것을 생성 한 Hibernate 세션과 연관되어있다.

    프레임 워크는 두 번째 요청을 처리하려고 할 때 HttpSession 개체의 이전 요청에서 엔터티를 찾습니다. 그런 다음 lazy 초기화 된 자식 엔터티에서 이제 최대 절전 프록시 개체가있는 속성에 액세스하려고합니다. Hibernate 프록시 객체는 누군가가 자신의 프로퍼티 중 하나에 접근하려고 할 때 데이터베이스로부터의 정보로 그것을 채우기 위해 최대 절전 모드 세션을 요구할 실제 객체의 모방이다. 이것은 당신의 동면 프록시가하려고하는 것이다. 그러나 이전 요청 처리가 끝날 때 세션이 닫히므로 이제는 수화 (실제 정보로 채우기) 위해 최대 절전 모드 세션이 없습니다.

    두 번째 요청이 시작될 때 이미 최대 절전 모드 세션을 열었을 수도 있지만이 엔터티가 다른 최대 절전 모드 세션에서 읽혀 졌기 때문에 프록시 개체가 포함 된 엔터티는 알 수 없습니다. 엔티티를 새로운 최대 절전 모드 세션에 다시 연결해야합니다.

    분리 된 엔티티를 다시 부착하는 방법에 대한 많은 논의가 있지만 가장 간단한 접근법은 바로 session.update (entity)입니다.

    희망이 도움이됩니다.

  2. from https://stackoverflow.com/questions/16752799/could-not-initialize-proxy-no-session by cc-by-sa and MIT license