2012-03-29 4 views
1

ItemVersionLanguage 객체에 대해 최대 절전 모드 병합()을 수행 할 때 "ERROR [org.hibernate.LazyInitializationException] (pool-9-thread-1)이 프록시를 초기화 할 수 없습니다. Session : org가 없습니다. .hibernate.LazyInitializationException : 프록시를 초기화 할 수 없습니다 - 세션 없음 "아래 코드에서.Hibernate 엔티티 getter에서 LazyInitializationException

하지만 그것에서 데이터를 얻을 때, 그것은 ItemVersion 또는 ItemVersionLanguage의 URL 중 하나에서 잘 작동합니다.

내가 찾아) (A @Transactional 병합하는 코드를 포장하지 않습니다.

ItemVersionLanguage.java

@Entity 
@Table(name = "item_version_language") 
public class ItemVersionLanguage implements java.io.Serializable { 
    private String url; 
    private ItemVersion itemVersion; 

    public void setUrl(String url) 
    { 
     this.url = url; 
    } 
    @Column(name = "url") 
    public String getUrl() 
    { 
     if(this.url == null) 
     { 
      return this.itemVersion.url; //this results in the problem! 
     } 
     else 
     { 
      return this.url; 
     } 
    } 
    public void setItemVersion(ItemVersion itemVersion) 
    { 
     this.itemVersion = itemVersion; 
    } 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "item_version_obj_id", nullable = false) 
    public ItemVersion getItemVersion() 
    { 
     return this.itemVersion; 
    } 
} 

ItemVersion.java

@Entity 
@Table(name = "item_version") 
public class ItemVersion implements java.io.Serializable { 
    private String url; 

    public void setUrl(String url) 
    { 
     this.url = url; 
    } 
    @Column(name = "url") 
    public String getUrl() 
    { 
     return this.url; 
    } 
} 

내가 뭔가 잘못을하고 있습니까?

답변

1

초기화 지연이있을 필요에 따라 그 값을 가져올 수있는 프록시로 가변 할 수있다. 이 오류는 엔티티를 검색하는 세션이 닫힌 후에 코드가 변수에서 읽으려고 시도 할 때 발생합니다. 그러면 프록시가 지연되어 값을 지연적으로 가져올 수 없습니다.

당신은 세션이 닫히기 전에 프록시의 값을로드들 Hibernate.initialize (itemVersionLanguage.getItemVersion())를 사용할 수 있습니다.

은 자세한 내용 http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/performance.html#performance-fetching-initialization를 참조하십시오.

관련 문제