@PrePersist
および注釈の存在については@PreUpdate
知っていますが、Xml マッピングで同等のものを使用する方法がわかりません。
Hibernate3イベント アーキテクチャPreInsertEvent
は同等のものを提供し、PreUpdateEvent
またはSaveOrUpdateEvent
(完全なリストについてはパッケージを参照) のリスナーを登録しorg.hibernate.event
て、作成/更新の日付を設定および更新できます。
別のアプローチは、 -scoped または-scopedのいずれかのinterceptorを使用し、両方とinを設定して inを更新することです。Session
SessionFactory
createDate
updateDate
onSave(...)
updateDate
onFlushDirty(...)
更新:元の提案を以下に残しますが、インターセプターまたはイベント アーキテクチャを使用することが正しいアプローチ (私の最初の答えであるべきだった) だと思います。
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
のようなフィールドには適切な選択ではないと思います(後者では機能する可能性がありますが、それは目的ではありません)。createDate
updateDate
timestamp
したがって、実際には生成されたプロパティを引き続き使用します が、代わりに単純なプロパティ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
この回答の上部を参照してください...