2017-01-11 1 views
0

내가 좋아하는 것은 다음과 같이 데이터베이스에서 House 객체를로드 :로드 대일 클래스 최대 절전 모드

House temp = DataBaseConnector.getInstance().findHouseByID(id); 
System.out.println(temp.getType().getName()); 

을하지만 언제 내가 액세스하려고 getType() 필드 내가 얻을 오류 :

Exception in thread "AWT-EventQueue-0" org.hibernate.LazyInitializationException: could not initialize proxy - no Session at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:165) at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:286) at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185) at mapping.Type_$$_jvstd13_0.getName(Type_$$_jvstd13_0.java) ..

findHouseById 기능은 다음과 같습니다

public static House findHouseByID(Integer id) { 
    Session session = getSessionFactory().openSession(); 
    House e = (House) session.load(House.class, id); 
    session.close(); 
    return e; 
} 

어떤 도움 것 감사합니다 :)

답변

0

메서드 내에서 개체를로드 한 후 세션을 닫았 기 때문에 예외가 발생하면 temp.getType()을 호출하는 시점에 최대 절전 모드 세션이 없습니다. 객체의 상태에 대한

다음

몇 가지 정보 : 최대 절전 모드가 해제 된 개체의 초기화되지 않은 필드 type을 전파하기 위해 데이터베이스에 액세스하려고하기 때문에 당신이 LazyInitializationException을 얻을 것이다

https://docs.jboss.org/hibernate/core/3.3/reference/en/html/objectstate.html

때문에이 사실에. (

https://docs.jboss.org/hibernate/jpa/2.1/api/javax/persistence/FetchType.html

또는 당신은 세션의 범위를 증가시켜야 :

는 어느 쪽이든 당신은 그래서 데이터베이스 액세스가이 시점에서 필요하지 않습니다 EAGER에 필드 type의 인출 전략을 변경, 여기 좀 봐 세션이 닫히기 전에 getType로 전화하십시오.)

+0

나는 열망이 같은 가져 오기 추가 시도했다 : \t @JoinColumn (이름 = "TYPE_ID") \t 공공 형 getType로() { \t \t 반환 유형을 (FetchType.EAGER을 = 가져 오기) @ManyToOne; \t}하지만 작동하지 않았습니다. –

+0

관련 모델 수업을 게시 해주십시오. –

+0

Btw, 속성/필드 액세스가 섞여있을 가능성이 있습니까? getter 대신 필드에 주석을 추가하려고 시도한 적이 있습니까? http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-mapping-entity –