EclipselinkアプリケーションをJBoss 6にバンドルされているHibernate 3.6を使用するように変換しています。このために遅延読み込みを行う方法を変更する必要があります。休止状態を使用するのは初めてのことではありません。LazyInitializationExceptionがマージ後に読み込まれました
ただし、マージ後にコレクションが初期化されていないようです。私はこれまでにこの行動を見て覚えていない。たとえば:
Entity entity = entityDAO.getEntity(id);
System.out.println(entity.getMyCollection().size()); // OK, no exception
entity = entityDAO.update(entity);
System.out.println(entity.getMyCollection().size()); // Throws LazyInitializationException
EntityDAOはスニペット:
public Entity getEntity(Long id){
Entity e = entityManager.find(Entity.class, id);
Hibernate.initialize(e.getMyCollection());
return e;
}
public Entity update(Entity entity){
return entityManager.merge(entity);
}
エンティティスニペットを:
@OneToMany(mappedBy="entity", cascade=CascadeType.ALL, orphanRemoval=true)
private List<AnotherEntity> myCollection = new ArrayList<AnotherEntity>();
は、これは本当に期待される動作ですか?休止状態がマージ中にデータを捨てるのは非常に奇妙なようです。
あなたのサンプルの重要な部分が削除されたと思います。左セッションが "update"と "entity.getMyCollection()"の間にある場合にのみ、 "LazyInitializationException"がスローされるためです。 –
ああ、私は明確にすべきです:このコードは、マネージドBeanのセッションの外に完全に存在します。本当の問題は、マージ後に初期化されたコレクションが初期化されていない場合にのみ発生するため、実際のコードは不要です。 –