2016-09-08 3 views
0

これは古典的な問題ですが、何とかこの問題の解決方法を理解できません。ハンドラメソッドのコントローラのどこかにJSP内のオブジェクトのOneToManyリストにアクセスする際のLazyInitializationException EL

@OneToMany(cascade=CascadeType.ALL, mappedBy = "a") 
public Set<B> getBList() { 
    return this.bList; 
} 

、私は

のようなものを持っている:

は、だから私は2つのエンティティ、AとB

次のメソッドを持っているAIで

の間にOneToManyの関係を持っています

@RequestMapping("/") 
public String method(Model model){ 
    A a = aDAO.findById(1); 
    for(B b : a.getBList()){ 
     System.out.println(b); 
    } 
    model.addAttribute("a",a); 
} 

と私は、次のELを持つJSPページ内:

${a.bList} 

ハンドラメソッドでは、すべて正常に動作し、Aオブジェクトが持つBオブジェクトのリストがコンソールに正しく表示されます。

しかし、JSPページのレンダリング時に、LazyInitializationExceptionが表示されます。

org.hibernate.LazyInitializationExceptionを:com.entities.A.bList、無セッションまたはセッション:なまけ役割のコレクションを初期化に失敗しました

この例外は通常、Aが取得されたセッションが終了しているので、私が間違っている場合は表示されます(私が間違っている場合は正しく表示されます)。 しかし、DAOクラスのfindById(Long id)メソッドではセッションを閉じません。 そして、それがハンドラーメソッドでの印刷が機能する理由だと思います。しかし、なぜELによって例外が生じるのでしょうか?セッションはJSPページの解釈で閉じられますか?

また、ELでリストにアクセスできるようにするにはどうすればよいですか?

+0

[Solveはロールのコレクションを遅延して初期化できませんでした]の重複の可能性があります。(http://stackoverflow.com/questions/11746499/solve-failed-to-lazily-initialize-a-collection-of-role -exception) –

+1

あなたのDAOのfindByIdメソッドに@Transactional属性を置きましたか? –

+0

はい、@ JekinKalariya、それは働いた。ありがとうございました。私はこの注釈が実際に何をしているのかを調べます。 –

答えて

0

あなたが言いましたように、hibernateトランザクション内でメソッドを実行する必要があるので、あなたはあなたのDAOメソッドに@Transactional Attributeを書く必要があるので、hibernateセッションの問題です。

関連する問題