2

遅延読み込みフィールドを含むエンティティを読み込み、ActiveMQを使用してオブジェクトメッセージを介してこのエンティティを送信したい場合、次を受け取りますか?

  1. エンティティ全体(遅延読み込みフィールドが読み込まれている)または
  2. 送信されたエンティティ(遅延読み込みフィールドが読み込まれていません)?

いずれにせよ、Serializableマーカーをエンティティに配置する必要がありますか?

回答1の場合、回答2で説明されているように、エンティティを取得するために何をする必要がありますか?

4

1 に答える 1

0

次のような遅延読み込みフィールドを持つエンティティがあると仮定します。

@Entity
public class Foo
{
    @Id
    private Long id;
    @OneToMany
    private List<Bar> bars;
}

データベースからこのエンティティを受け取るidと、barsフィールドが遅延ロードされるため(OneToManyデフォルトでは遅延)、フィールドのみがロードされます。たとえば、このエンティティをJMSに渡すと、メソッドが呼び出されないbarsため、フィールドは初期化されません。getBars()リモートエンドがgetterを呼び出すとLazyInitializationException、エンティティがデタッチされ、コレクションが初期化されないため、が取得されます。

ただし、リモートエンドがメソッドを呼び出せるようにするgetBars()場合は、何らかの方法でコレクションを初期化する必要があります。を使用して、コレクションのフェッチを熱心に行うことができます@OneToMany(fetch = FetchType.EAGER)。別の方法は、エンティティの読み込みを熱心に行うために別のクエリを使用することです(これは私の個人的な好みです)。

例:

select f from Foo f join fetch l.bars

本当にワイルドになり、コレクションをリモートエンドで遅延初期化する場合は、RMIを使用したHibernateリモート遅延読み込みを確認できます。質問の範囲外のように思われるので、これについては説明しません。;-)

于 2012-09-10T12:01:52.307 に答える