5

次のシナリオがあります(Java / Hibernateで):

  • X と Y の 2 つのエンティティ クラスがあります。X には、カスケードされていない Y への @ManyToOne 関連付けがあります。
  • X の (管理されていない) インスタンス x と Y の (管理されていない) インスタンス y を作成し、y への参照を x に入力します。埋められる y の唯一のフィールドは主キーです。
  • エンティティ y は、基になるデータベースに対応する行が既にありますが、エンティティ x は新しいものです。
  • エンティティ x を永続化します。

このシナリオを実行すると、INSERT x という 1 つのクエリが表示されることが予想されます。ただし、実際には、Hibernate が 2 つのクエリを実行します。

  • yを選択
  • ×を挿入

さらに、x の永続化の後、y への参照が実際には管理されず、セッションに Y のインスタンスがないことにも気付きました! では、なぜ y に対する SELECT が実行されるのでしょうか? この動作を防ぐ方法はありますか?

4

1 に答える 1

3

Y を手動でインスタンス化する必要はありません (実際にはすべきではありません)。これの変形を行うことができます(構成によって異なります)

Y y = (Y) session.load(Y.class, pk);

これはデータベースから Y を取得するのではなく、言及した pk のみから構成されるプロキシをロードします。

次に、y を x に割り当て、x を永続化すると、期待どおりに動作します。

于 2011-06-30T14:15:28.220 に答える