在Xml映射中使用Hibernate设置创建和更新时间

Mar*_*ark 5 orm hibernate hbm hibernate-mapping

我正在使用Hibernate和Xml映射.我有一个实体有两个字段creationDateupdateDate类型timestamp,当实体被持久化和更新时,必须填充当前的UTC时间.我知道@PrePersist@PreUpdate注释的存在,但我不知道如何在我的Xml映射中使用它们的等价物.

再一次,我想知道Hibernate是否以某种方式支持本地更新和创建时间设置.

谢谢

Pas*_*ent 9

我知道@PrePersist@PreUpdate注释的存在,但我不知道如何在我的Xml映射中使用它们的等价物.

Hibernate3 事件体系结构提供了等效的东西,您可以注册侦听器PreInsertEvent,PreUpdateEvent或者SaveOrUpdateEvent(查看org.hibernate.event包的完整列表)来设置和更新创建/更新日期.

另一种方法是使用拦截器,无论是Session-scoped还是SessionFactory-scoped,并设置两者createDateupdateDatein onSave(...),更新updateDatein onFlushDirty(...).


更新:我将在下面留下我的原始建议,但我认为正确的方法(应该是我最初的答案)是使用拦截器或事件架构.

您可以在插入和插入和更新时分别使用数据库获取和生成的generated属性:timestampcreationDateupdateDate

<class name="MyEntity" table="MY_ENTITY">
  <id .../>
  <timestamp name="createDate" generated="insert" ... />
  <timestamp name="updateDate" generated="always" ... />
  ...
</class>
Run Code Online (Sandbox Code Playgroud)

有关完整详细信息,请参阅生成属性部分.

选项1

它似乎timestamp不支持generatead所以我的建议不起作用.尽管如此,在仔细阅读文档之后,我的理解是它timestamp是版本控制的替代方案,并且我认为它不适用于像(createDateupdateDate它可能适用于后者但不适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>
Run Code Online (Sandbox Code Playgroud)

在数据库级别,这将需要使用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>
Run Code Online (Sandbox Code Playgroud)

与选项1相同createDate,使用数据库级别的默认值.

选项3

看到这个答案的顶部......