@PrePersistおよび注釈の存在については@PreUpdate知っていますが、Xml マッピングで同等のものを使用する方法がわかりません。
Hibernate3イベント アーキテクチャPreInsertEventは同等のものを提供し、PreUpdateEventまたはSaveOrUpdateEvent(完全なリストについてはパッケージを参照) のリスナーを登録しorg.hibernate.eventて、作成/更新の日付を設定および更新できます。
別のアプローチは、 -scoped または-scopedのいずれかのinterceptorを使用し、両方とinを設定して inを更新することです。SessionSessionFactorycreateDateupdateDateonSave(...)updateDateonFlushDirty(...)
更新:元の提案を以下に残しますが、インターセプターまたはイベント アーキテクチャを使用することが正しいアプローチ (私の最初の答えであるべきだった) だと思います。
generatedの属性を使用して、挿入時および挿入時と更新時にそれぞれデータベースによってtimestamp取得creationDateおよび生成できます。updateDate
<class name="MyEntity" table="MY_ENTITY">
<id .../>
<timestamp name="createDate" generated="insert" ... />
<timestamp name="updateDate" generated="always" ... />
...
</class>
詳細については、生成されたプロパティのセクションを参照してください。
オプション1
timestampサポートしていないように見えるgenerateadので、私の提案は機能しません。それにもかかわらず、ドキュメントをより注意深く読んだ私の理解では、それはバージョン管理の代替であり、 andtimestampのようなフィールドには適切な選択ではないと思います(後者では機能する可能性がありますが、それは目的ではありません)。createDateupdateDatetimestamp
したがって、実際には生成されたプロパティを引き続き使用します が、代わりに単純なプロパティtimestampを使用します。
<class name="MyEntity" table="MY_ENTITY">
<id .../>
<property name="createDate" update="false" insert="false" generated="insert" ... />
<property name="updateDate" update="false" insert="false" generated="always" ... />
...
</class>
データベース レベルでは、列のトリガーを使用する必要がありupdateDateます。createDate列の場合、デフォルト値のようなものを使用するとcurrent_timestampうまく機能します。しかし、トリガーはおそらく必要ありません...
オプション 2
オプション 1のトリガーを回避するにはupdateDate、バージョン管理に使用するバリエーションがあります(したがって、 としてマップしますtimestamp)。
<class name="MyEntity" table="MY_ENTITY">
<id .../>
<timestamp name="updateDate" ... />
<property name="createDate" update="false" insert="false" generated="insert" ... />
...
</class>
のオプション 1 と同じ方法createDateで、データベース レベルでデフォルト値を使用します。
オプション 3
この回答の上部を参照してください...