XML マッピングで Hibernate を使用して作成時間と更新時間を設定する
-
26-09-2019 - |
質問
Hibernateを使用しています XML マッピング。2 つのフィールドを持つエンティティがあります 作成日 そして 更新日 タイプの timestamp
, 、エンティティが永続化および更新されるときに、現在の UTC 時間を入力する必要があります。の存在は知っていますが、 @PrePersist
そして @PreUpdate
注釈を使用できますが、Xml マッピングで同等の注釈を使用する方法がわかりません。
繰り返しになりますが、Hibernate が何らかの方法で更新および作成時間のセットをネイティブにサポートしているかどうか疑問に思っていました。
ありがとう
解決
の存在は知っていますが、
@PrePersist
そして@PreUpdate
注釈を使用できますが、Xml マッピングで同等の注釈を使用する方法がわかりません。
ハイバネート3 イベントアーキテクチャ 同等のものを提供しており、リスナーを登録できます PreInsertEvent
, PreUpdateEvent
または SaveOrUpdateEvent
(を参照してください。 org.hibernate.event
完全なリストのパッケージ) を使用して、作成/更新日を設定および更新します。
別のアプローチは、 インターセプター, 、 どちらか Session
-スコープ指定または SessionFactory
-scoped と両方を設定する場合 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
したがって、私の提案は機能しません。それにもかかわらず、ドキュメントをより注意深く読んだ私の理解は、 timestamp
はバージョン管理の代替手段であり、次のような分野には適切な選択ではないと思います。 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
この回答の先頭を参照してください...
他のヒント
Hibernate のタイムスタンプは、エンティティが変更されると常に自動的に更新されるようです。そのため、 <timestamp>
作成日のマッピング。ただし、単純に保存することもできます。 java.util.Date
プロパティを使用して初期化しました new Date()
.
更新のタイムスタンプについては、次のことを試してください。
public class MyEntity {
...
private Date updateDate;
...
}
<class name="MyEntity" table="MY_ENTITY">
<id .../>
<timestamp name="updateDate" access="field" column="UPDATE_DATE"/>
...
</class>
ご了承ください timestamp
直後に来なければなりません id
マッピングで。
参考までに、ここでは の参照 timestamp
属性.