2012-04-16 14 views
1

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>(); 

は、これは本当に期待される動作ですか?休止状態がマージ中にデータを捨てるのは非常に奇妙なようです。

+0

あなたのサンプルの重要な部分が削除されたと思います。左セッションが "update"と "entity.getMyCollection()"の間にある場合にのみ、 "LazyInitializationException"がスローされるためです。 –

+0

ああ、私は明確にすべきです:このコードは、マネージドBeanのセッションの外に完全に存在します。本当の問題は、マージ後に初期化されたコレクションが初期化されていない場合にのみ発生するため、実際のコードは不要です。 –

答えて

2

これは本当に動作が期待されています。 merge()

  • が結合エンティティ を結合した1つに取り外しエンティティの状態、
  • をコピーして戻す、

    • 引数として渡された取り外しと同じIDを持つエンティティを取得することからなります

      返された添付エンティティの遅延コレクションを再初期化しないと、コレクションはロードされません。

  • +0

    *分離されたエンティティの状態を添付されたものにコピーする*。これはカスケード= CascadeType.ALLのためにコレクションにカスケードしてはいけませんか? –

    +0

    私はカスケードを見逃しました。しかし、コレクションで何も変更されていなければ、私はHibernateがコレクションをロードすることを余儀なくされているのかどうかはわかりません。 –

    関連する問題