質問

Hibernateを使用しています XML マッピング。2 つのフィールドを持つエンティティがあります 作成日 そして 更新日 タイプの timestamp, 、エンティティが永続化および更新されるときに、現在の UTC 時間を入力する必要があります。の存在は知っていますが、 @PrePersist そして @PreUpdate 注釈を使用できますが、Xml マッピングで同等の注釈を使用する方法がわかりません。

繰り返しになりますが、Hibernate が何らかの方法で更新および作成時間のセットをネイティブにサポートしているかどうか疑問に思っていました。

ありがとう

役に立ちましたか?

解決

の存在は知っていますが、 @PrePersist そして @PreUpdate 注釈を使用できますが、Xml マッピングで同等の注釈を使用する方法がわかりません。

ハイバネート3 イベントアーキテクチャ 同等のものを提供しており、リスナーを登録できます PreInsertEvent, PreUpdateEvent または SaveOrUpdateEvent (を参照してください。 org.hibernate.event 完全なリストのパッケージ) を使用して、作成/更新日を設定および更新します。

別のアプローチは、 インターセプター, 、 どちらか Session-スコープ指定または SessionFactory-scoped と両方を設定する場合 createDate そして updateDateonSave(...), を更新します。 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 したがって、私の提案は機能しません。それにもかかわらず、ドキュメントをより注意深く読んだ私の理解は、 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 属性.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top