私は次のJSF/PrimeFacesEJBアーキテクチャを持っています:
[JSF /PrimeFacesxhtmlビュー]->[@ManagedBeanJSF Bean]-> [@Stateless EJB3 Bean] --JPA-> [DB]
つまり、JSFビューは、バッキングBean(@ManagedBean)でアクセスするエンティティとコレクションを表示します。これらのコレクションとエンティティは、 EntityManagerが注入されたステートレスEJB3「ファサード」Beanを呼び出してフェッチされ、 JPAを使用してデータベースにアクセスします。休止状態。ステートレスEJB3Beanもいくつかのサービスを提供しますが、それらの役割の大部分は、それらを表示する必要があるxhtmlビューによって要求されるように、データベースからエンティティオブジェクト( JPA注釈付き)を提供することです。
これが重要です。私の理解が正しければ、エンティティBeanがステートレスEJB3 Beanによって返されるとすぐに、各EJB3Beanメソッドがトランザクションを区切るときにエンティティBeanが切り離されます。その場合、xhtmlビューとJSFマネージドBeanがフェッチされたエンティティオブジェクト(1対多のコレクションなど)のグラフをナビゲートするときに、次のようなレイジー初期化例外が発生することがよくあります。
javax.el.ELException: ... org.hibernate.LazyInitializationException: failed
to lazily initialize a collection of role: ..., no session or session was closed
動作する唯一のことは、コレクションをEAGERでロードするように変更することですが、これは実用的な解決策ではありません。デタッチされたJPAエンティティがビューレイヤーへの道を見つけるときに使用するいくつかの良いパターンは、各ケースをアドホックな方法で処理するのではなく、すべての遅延初期化例外を回避するために何ですか?