2009-08-21 7 views
1

秒の時間を取得するために節約Hibernateはシーケンス私はこのようなクラスを持っている

public class A{ 
     private B b; 
     private C c; 
} 

私はこのオブジェクトを作成していますし、(ゲッターとセッターとし、すべてのOracle DBへのシーケンスで、それぞれを休止状態にマップ)それをデータベースに保存します。

だから私は、オブジェクトを作成し、Bのオブジェクトを移入し、私は「A」と生成された「B」配列を持つことができます

saveOrUpdate(a) 

を呼び出します。私はいくつかの計算を行い、 "C"のインスタンスを作成し、それを "a"に設定します。

ここまでは、すべてがうまくいきます。私は今、 "c"のIDを取得する必要がありますので、私はフラッシュしてコミットする前にいくつかのチェックを行います。

オブジェクトが一時的ではなくなったため、saveOrUpdateはここでは機能しません。 saveOrUpdateのhibernateドキュメントによると: "オブジェクトがこのセッションで既に永続的な場合は何もしない"

アイデアはありますか?

(それが長すぎると厄介だが、それは基本的にそれだから、コードを投稿することはできません)

答えて

0

Cは休止状態マッピングされたクラスであり、休止状態よりもproperyが正しく、マッピングされている場合は、プロパティCを持っていることを検出しますセッションがフラッシュされるか、アクティブなトランザクションがコミットするときに変更されます。次に、コミット後にCのIDを取得することができます。

他のアプローチは、saveOrUpdate(c)を呼び出すことです。その場合は、idを割り当てて取得することができます。

cのIDが必要なことを確認していますか?

+0

しかし、私はフラッシュしてコミットする前にCのIDが必要です。 "a"はすでにこのセッションで永続化されているので、変更されたかどうかをチェックしないので、saveOrUpdateを "a"で2回呼び出しても何もしません(DB制約のために)。私はクエリの文字列にそのidを持つURLを作成し、それを別のフィールドに入るテキストに入れるためにcのIdが必要です。 –

+0

wll、saveOrUpdate(c)呼び出しを行うよりも、hibernateはあなたのテキストフィールドに使用できるidを割り当てます。フィールドがcのプロパティであれば、それはHibernateによって正しく永続化されます。 – Salandur

関連する問題