5

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

同样,我想知道 Hibernate 是否以某种方式原生支持更新和创建时间集。

谢谢

4

2 回答 2

9

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

Hibernate3事件架构提供了等效的东西,您可以为 注册侦听器PreInsertEventPreUpdateEvent或者SaveOrUpdateEvent(请参阅org.hibernate.event包以获取完整列表)来设置和更新创建/更新日期。

另一种方法是使用-scoped 或-scoped拦截器,并同时设置and 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,所以我的建议不起作用。尽管如此,在更仔细地阅读了文档之后,我的理解是它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

为了避免触发Option 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 回答