2009-08-12 1 views
2

私は、ブール型フィールドを表すためにカスタムタイプを使用するHibernateモデルを持っていますブール値オブジェクトの値を(trueからfalseまたはfalseからtrueに)変更すると、オブジェクトの値は変更されますが、Hibernateセッションマネージャはオブジェクトに何かがあるとは思わないようです値が変更されているため、save()は実際にSQLをDBに書き込まないカスタムタイプの変更を伴うHibernateフィールドですが、更新のために 'ダーティ'としてマークされていないオブジェクト

私のカスタムタイプでは、アクセサーではそれ自体ですが、それも可能です。

答えて

1

まず、Hibernateの組み込みブール型の代わりにカスタム型を使用している理由はありますか?

<property name="some_flag" type="boolean"/> 

第二に、いいえ、あなたはあなたのカスタムタイプに「特別な」何もする必要はありませんが、あなたは正しく、とりわけそのequals()deepCopy()メソッドを実装する必要があります。ソースを投稿できますか?

0

save()は、実際にオブジェクト(またはその変更内容)をデータベースに保存しません。これは永続的なもの、すなわちHibernateが管理していると考えるオブジェクトとしてマークします。オブジェクトが切り離されている場合は、update()を呼び出します。

あなたは作業が完了したらflushing the Sessionですか?そして/またはclosing itsave()と他の方法との違いを忘れてしまった、とも忘れてしまった - 私は今日Hibernateで同じ問題を自分で持っていた、あなたがダブルチェックModifying Persistent ObjectsのHibernateのマニュアルは(私はこれが毒舌であることを言っていないにもできます

flush()私のセッション)。

2

2つの解決策があります。 Hibernateは呼び出す

  1. は、オブジェクトが変更されたかどうかを確認する方法に等しく、その前には、カスタムオブジェクトのコピーを取得するにはdeepCopyメソッドを呼び出します。したがって、deepCopyメソッドでは、カスタムオブジェクトの新しいコピーを作成し、equalsメソッドを正しく実装します。

  2. 第2の解決策は、AccessType.FIELDとAccessType.PROPERTYを組み合わせて使用​​しています。これは推奨されていませんが、それはあなたが知っているかどうかを確認することができます。

これは、以下のようにマッピングする必要があります。

@Entity @Table(名= TABLE_NAME)

@access(AccessType.FIELD)

パブリッククラスEntityClass {

/// ---いくつかのフィールド

@Column(name = "CustomCol")

@Type(type = "com.something。CustomColType ")

CustomClass customClass;

//

は - ゲッターsettters

}

あなたはウルのクラスにカスタムオブジェクトを持っていて、そのオブジェクトを変更する場合にのみ、それはとしてマークされません。解決方法1:他の属性をcustomClassオブジェクトで更新する 解決方法2:@Access(AccessType.PROPERTY)をcustomClassフィールドに置き、getter/setterを同じにします。 これはオーバーライドされます。クラスレベルに置くデフォルトのAccessType.Fieldの動作。

@Access(AccessType.PROPERTY)がクラスレベルの場合、この問題は再現できません。

関連する問題