2011-06-25 8 views
5

Iは、(ジャワ/休止状態で)次のシナリオを持っている:挿入時に不要な選択を防止する方法はありますか?

  • Iは、2つのエンティティ・クラスを持って:XおよびY Xは、カスケード接続されていないYに@ManyToOneの関連付けを有します。
  • IはXとYの(アンマネージ)インスタンスYのX(管理対象外)のインスタンスを作成し、XのYへの参照を埋めます。満たされているyの唯一のフィールドは主キーです。
  • エンティティyには、基になるデータベースには対応する行がすでに存在しますが、エンティティxは新しいものです。
  • 私はエンティティxを存続させます。

このシナリオを実行すると、1つのクエリINSERT xが表示されます。しかし、どのような実際に起こることは、Hibernateは2つのクエリを実行することである:

  • SELECT Y
  • INSERT X

はさらに、私はまた、Xの持続した後、Yへの参照が実際にないことを確認しセッションにはYのインスタンスがありません。ですから、なぜyのSELECTはまったく実行されますか?この現象を防ぐ方法はありますか?

答えて

2

あなたは(実際には、あなたがすべきではない)手動でYをインスタンス化する必要はありません。代わりに、それはあなたが言及したPKからのみからなるプロキシをロードし、

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

これは、データベースからYを取得しません(設定によって)このの変形を行うことができます。

は、その後のxにyと割り当て、あなたが期待するようxは振る舞う持続します。

+0

ニースは、魅力的な作品です!私の質問の他の部分の任意のアイデア:私のシナリオでは、なぜHibernateはyでSELECTを行うのですか? – Rubrick

+0

私はそれについて考えましたが、特定の答えはありませんでした。私の推測は、インスタンスを手動で作成したからです.Hibernateは、データベースに実際に存在するかどうかをチェックする必要があるため、デタッチされたオブジェクト(hibernate永続コンテキストによって管理されていないオブジェクト)です。しかし、たとえそれが存在しないとしても、dbは外部キーの制限エラーをスローし、挿入が防止されたため、私はそれについてはわかりません。要するに、私は知らない:) – SelimOber

関連する問題