2012-03-29 3 views
1

ItemVersionLanguageオブジェクトにHibernateマージ()を実行すると、 "ERROR [org.hibernate.LazyInitializationException](pool-9-thread-1)がプロキシを初期化できませんでした。 .hibernate.LazyInitializationException:以下のコードから "プロキシを初期化できませんでした - セッションはありません"。HibernateエンティティゲッターのLazyInitializationException

しかし、データを取得すると、ItemVersionまたはItemVersionLanguageのURLから正常に機能します。

@transactionalには、merge()が配置されているコードをラップすることはありません。

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を参照してください。

関連する問題