2

Hibernate 4.1.7.Final を使用しており、session.merge(entity)メソッドを使用してオブジェクトを更新しようとしています。エンティティには次の注釈が付けられます。

@SelectBeforeUpdate(true)@DynamicUpdate(true)

ただし、me​​rge メソッドが元の非 null フィールド (以前に永続化されたエンティティ内) を、マージされるエンティティからの null 値で上書きすることがわかりました。これは望ましくありません。@DynamicUpdatenull以外の値のみを更新すると思いました。

Hibernate ドキュメントのマージ メソッドの説明は次のとおりです。

指定されたオブジェクトの状態を、同じ識別子を持つ永続オブジェクトにコピーします。セッションに現在関連付けられている永続インスタンスがない場合は、ロードされます。永続インスタンスを返します。指定されたインスタンスが保存されていない場合は、のコピーを保存し、それを新しい永続インスタンスとして返します。指定されたインスタンスはセッションに関連付けられません。関連付けが cascade="merge" でマップされている場合、この操作は関連付けられたインスタンスにカスケードします。

何が問題なのですか?

ありがとう。

4

1 に答える 1

0

私がすぐに考えることができる2つのこと:

  1. Hibernate doc によると、Session.merge() がデタッチされたインスタンスに加えられた変更を正しく処理するには、バージョン/タイムスタンプ列 (JPA を使用する場合は @Version アノテーション) を楽観的ロック戦略として使用する必要があります。必ずこの戦略を使用してください。

  2. @SelectBeforeUpdate と @DynamicUpdate は継承できないため、正しいエンティティに注釈が付けられていることを確認してください。

于 2013-03-23T15:18:12.293 に答える