2012-05-14 7 views
1

はここにあります:のJava EE 6 + Hibernateは遅延ロード例外

javax.servlet.ServletException: org.hibernate.LazyInitializationException:it.trew:怠惰な役割の コレクションを初期化に失敗しました

@Entity 
@Table(name = "tipi_caratteristiche") 
public class TipoCaratteristica implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id") 
    private Long id; 

    private String nome; 

    @OneToMany(cascade = CascadeType.ALL) 
    @JoinTable(
     name = "tipi_caratteristiche_traduzioni", 
     joinColumns = { @JoinColumn(name = "tipo_caratteristica_id") }, 
     inverseJoinColumns = { @JoinColumn(name = "traduzione_id") } 
    ) 
    private List<Traduzione> traduzioni = new ArrayList<Traduzione>(); 
:.model.TipoCaratteristica.traduzioni、何 セッションまたはセッションが

私のエンティティのコードの一部を閉鎖しませんでした

"Traduzione"は、一対のStringプロパティを持つシンプルなプレーンエンティティです。

私はidで "TipoCaratteristica"を読み込み、そのリストをタグに表示しようとする "編集" jsfページを持っています。

私が編集されたオブジェクトの取得のためのejb-ファサードのメソッドを使用します。

TipoCaratteristica tc = ejbFacade.find(Long.valueOf(value)); 

私はその例外について何かを読んで:JSFバッキングBeanで、その後

public T find(Object id) { 
     return getEntityManager().find(entityClass, id); 
    } 

を。実際には、 "traduzioni"コレクションの取り込みタイプEAGERを設定すると修正されますが、私はしたくありません。 トランザクションですべてをやっていることや、Hibernate.initialize()を使っていることについて読んだことがありますが、その方法は分かりません。

お願いします。

答えて

2
@Override 
public TipoCaratteristica find(Object id) { 
    TipoCaratteristica result = super.find(id); 
    Hibernate.initialize(result.getTraduzioni()); 
    return result; 
} 

またはその代わりのem.find()を使用して、すべてが単一のクエリでロードするクエリを使用します。

select distinct tc from TipoCaratteristica 
left join fetch tc.traduzioni 
where tc.id = :id 
+1

あなたは、EJBファサードの基本パラメータ化されたクラスと、すべてのエンティティのこのEJBファサードの1つのサブクラスを持っているようです。上記のオーバーライドされたメソッドは、TipoCaratteristicaエンティティのEJBファサードに存在する必要があります。私の前提が間違っている場合は、コードを投稿してください。 –

+0

私はinitialize()がEJBメソッド内で行われなければならないことを覚えておかなければならないのですか? –

+0

トランザクション内でセッションがまだ開いている場所で実行する必要があります。セッションが終了したら、それと同じことを行うと、明らかに同じ遅延ロード例外が発生します。 –

2

あなたのエンティティマネージャでは、この使用してPersistentContext.EXTENDED属性を解決することができます。

例:

@PersistentContext(type=PersistentContext.EXTENDED) 
private EntityManager em; 

または新しいバージョンで:

@PersistentContext(type=PersistentContextType.EXTENDED) 
private EntityManager em; 

エンティティマネージャのトランザクションが閉じられているすべてのトランザクションのために、この属性は、これを回避し、エンティティマネージャの滞在が可能なことができますので、このエラーが発生しました。ダン・アレンのSeam in Actionの書籍の詳細を読むことができます。彼はこの問題について詳しく説明しています。

関連する問題