2012-05-04 10 views
0

同じサービス(トランザクション)内で同じエンティティをマージ(更新)した後、その子(結合)でエンティティを選択したいとします。私はあなたが更新したオブジェクトをマージすることを知っていますが、このオブジェクトはデータベースのデータを持つすべてのエンティティではなく、更新されたデータを持っています。さらに、マージ後に選択子を実行して、すべての子を持つエンティティを取得しようとすると、更新されたデータのみで更新されたオブジェクトが返されます(残りのフィールドと子エンティティはnullです)。マージ後の選択:Hibernate

解決方法はありますか?サービスには、コミットする前に正しく実行されなければならない多くのデータベース操作があるため、同じトランザクション内のすべてを実行することが必須です。

ありがとうございました。よろしくです。 よろしくお願いします。

+0

あなたのコードを教えてください。マージによって返されたエンティティは、データベースにISが含まれているか、少なくともセッションがフラッシュされた後にデータベースに格納されるものを含む添付エンティティです。残りのフィールドがnullの場合、セッションがフラッシュされるとデータベース内でnullになることを意味します。これは大きな問題があることを意味します。 –

+0

あなたは正しいですが、エンティティの1つのフィールドを更新したいだけなので、このフィールドでエンティティオブジェクトを作成しました。残りはnullです。だから私はあなたの答えを理解することができます、私はすべてのフィールドをエンティティを構築する必要があります...私は更新したいフィールドだけを更新する方法はありません? – user1260893

+0

次に、セッションからエンティティを取得し、フィールドを設定します。 'Foo f = session.get(Foo.class、id); f.setSomeField(newValue); System.out.println( "done"); ' –

答えて

0

これはコードをどのように構造化したかによって異なります。あなたが達成しようとしているものに対してより多くの情報/コードを提供できるなら、それは役に立ちます。

エンティティとその子の間でカスケードオプションを適切に設定しているかどうかを確認してください。マージ操作のカスケードを設定することもできます。これにより、子をリフレッシュする必要があります。 (注:これは、遅延ロードの場合にマージ操作の前に子のいずれかがフェッチされた場合にのみ機能します)。

2番目の質問では、コードをどのように構造化したか、そしてdbからデータをフェッチする方法にも依存します。 しかし理想的には、1つの要求/作業単位に関連するすべてのデータベース操作は、1つのトランザクション内で処理する必要があります。

+0

カスケードで更新したくありません...私のデータベースには、私のJSPに表示されている行があります。私は1つのフィールドだけを変更してから、この変更を含むオブジェクトを送信します(エンティティはIDとフィールドが変更され、残りのフィールドはnullになります)。私の意図は、修正されたフィールドだけを更新することですが、今私は私ができることを私の疑問を持っています。 – user1260893

+0

IDと変更されたフィールドのみを持つ新しいエンティティを作成できます。このエンティティに他のすべてのフィールド(値としてnullを渡す)を追加しないでください。これがあなたの問題を解決することを願っています。 – sak

関連する問題