5

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

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

ありがとう

4

2 に答える 2

9

@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

この回答の上部を参照してください...

于 2010-04-14T16:31:07.253 に答える
1

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ここに示します。

于 2010-04-14T12:24:52.003 に答える