2009-08-06 3 views
0

Hibernate 3を考慮するグラフをプッシュするときに重複する子オブジェクトが既に存在するかどうかをチェック

私は親テーブルと外部キーでリンクされた子テーブルを持っています。 カスケードのすべてのプロパティを持つ親hbmファイルに多対1の関連付けを宣言します。 私は最初に親を退室(または保存)し、親と子を保存します。これまでのところ良い。 しかし別のセッションでは、私は新しい親オブジェクト(最初のセッションのものとは異なるfunctionnaly)を作成し、新しい子オブジェクトへの参照を作成します(ただし、最初のセッションのものと同じfunctionnalyです

私は、Hibernateがネイティブにサポートしていることを知りたいと思います。私は同じ子を管理しています(それで、新しい親を保存するときに永続化しようとしません)。データベースへの往復を開発し、子供がすでに存在するかどうかを確認する必要がありますか?

ありがとうございます。

答えて

2

Hibernateはオブジェクトを主キーで識別します。したがって、これらの2人の子供が、ビジネス生成キーである必要がある同じ主キーを持つ場合、Hibernateはそれが同じオブジェクトであることを知ります。しかし、データベースへの更新または挿入を実行する必要があるかどうかはまだ分かりません。あなたは子供の上でmergeを明示的に呼び出すことができます、Hibernateはそれをデータベースで検索し、それを作成または更新します。

しかし、それはこのように簡単ではありません。

一つの問題は、ビジネス、生成した鍵です。 Hibernateに代理キーを生成させる方が良いでしょう。

mergeを使用する必要があります。このクラスは、このクラスが格納されている場合は常に使用する必要があります。とにかくそれを明示的に保存する必要があるので、カスケードを削除することを検討してください。

mergeは、使用する必要がある別のインスタンスを返します。 (これは意味:親のプロパティにmergeの戻り値を割り当てる。)あなたが持っている

根本的な問題は、ビジネスロジックが二度同じオブジェクトを作成していることです。他の人が作成したインスタンスを再利用する場合は、データベースで検索するか、引数として渡すか、取得する必要があります。回避策を試す前に、このような問題を解決してください。