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

时间:2010-04-14 05:16:30

标签: hibernate orm hibernate-mapping hbm

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

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

由于

2 个答案:

答案 0 :(得分:9)

  

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

Hibernate3 event architecture提供了相同的功能,您可以注册PreInsertEventPreUpdateEventSaveOrUpdateEvent的侦听器(有关完整列表,请参阅org.hibernate.event包)设置和更新创建/更新日期。

另一种方法是使用interceptorSession - 作用域或SessionFactory - 作用域,并在{{createDateupdateDate中设置onSave(...)updateDate 1}},更新onFlushDirty(...)中的generated


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

您可以使用 timestamp creationDate 属性来获取 updateDate <class name="MyEntity" table="MY_ENTITY"> <id .../> <timestamp name="createDate" generated="insert" ... /> <timestamp name="updateDate" generated="always" ... /> ... </class>

timestamp

有关详细信息,请参阅generated properties部分。

选项1

timestamp 似乎不支持generatead,因此我的建议不起作用。不过,在仔细阅读文档之后,我的理解是 createDate 是版本控制的替代方案,我认为它不适合像 {{1}这样的字段。 } updateDate (它可能适用于后者,但不是timestamp的用途)。

所以我实际上仍会使用generated properties simple properties而不是 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>

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

选项3

请参阅此答案的顶部...

答案 1 :(得分: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之后。

这里仅供参考reference of the timestamp attributes