hibernate の session.load 関数の使用に問題があります。ID に従ってオブジェクトを取得しようとすると、適切なオブジェクトが返されますが、インスタンスにはプリミティブ プロパティしか設定されていません。セット (他のオブジェクトにマップされている) を持つプロパティがありますが、セット後に取得されず、セットのフィールドが null です。
フェッチが期待どおりに機能しない理由を誰かが知っていますか?
ありがとう
hibernate の session.load 関数の使用に問題があります。ID に従ってオブジェクトを取得しようとすると、適切なオブジェクトが返されますが、インスタンスにはプリミティブ プロパティしか設定されていません。セット (他のオブジェクトにマップされている) を持つプロパティがありますが、セット後に取得されず、セットのフィールドが null です。
フェッチが期待どおりに機能しない理由を誰かが知っていますか?
ありがとう
セットは遅延ロードされていると思います。データを入力したい場合は、そのセットのゲッターを呼び出すだけでロードされます。常にロードしたい場合は、追加できます
fetch = FetchType.EAGER
例:
@OneToMany(mappedBy = "program", fetch=FetchType.EAGER)
private final List<Instruction> instructions = new ArrayList<Instruction>();
エンティティのマッピングへ
100% 肯定的でない限り、常に子をロードする必要がありますEAGER
。フェッチを設定すると、望ましくない結果が生じる可能性があります。JBoss ToolsLAZY
はデフォルトでフェッチを に設定します。
代わりに、さまざまな方法で実行できる子関連付けを初期化する必要があります。
Hibernate.initialize(myObject.getChildren())
size
てください:myObject.getChildren().size()
Criteria
クエリでFetchMode
、関連付けの を次のように設定しJOIN
ます。criteria.setFetchMode("children", FetchMode.JOIN);
ORM でフェッチ戦略を確認してください。一部のプロパティは、eager ではなく lazy に設定できます。すべてのプロパティを埋めるために、ロード後に Hibernate.Initialize を使用する必要がある場合があります。それ以外の場合は、積極的な読み込みを使用するように ORM を変更する必要があります。注釈を使用して、@entity 属性の後に次のプロパティを設定し、デフォルトで遅延をオフにします。
@org.hibernate.annotations.Proxy(lazy = false)
ただし、これにより、フェッチ時にすべてがロードされます。