我正在使用带有Xml映射的 Hibernate。我有一个实体,它有两个字段creationDate和updateDate类型timestamp
,当实体被持久化和更新时,必须用当前 UTC 时间填充。我知道@PrePersist
和@PreUpdate
注释的存在,但我不知道如何在我的 Xml 映射中使用它们的等价物。
同样,我想知道 Hibernate 是否以某种方式原生支持更新和创建时间集。
谢谢
我正在使用带有Xml映射的 Hibernate。我有一个实体,它有两个字段creationDate和updateDate类型timestamp
,当实体被持久化和更新时,必须用当前 UTC 时间填充。我知道@PrePersist
和@PreUpdate
注释的存在,但我不知道如何在我的 Xml 映射中使用它们的等价物。
同样,我想知道 Hibernate 是否以某种方式原生支持更新和创建时间集。
谢谢
我知道
@PrePersist
和@PreUpdate
注释的存在,但我不知道如何在我的 Xml 映射中使用它们的等价物。
Hibernate3事件架构提供了等效的东西,您可以为 注册侦听器PreInsertEvent
,PreUpdateEvent
或者SaveOrUpdateEvent
(请参阅org.hibernate.event
包以获取完整列表)来设置和更新创建/更新日期。
另一种方法是使用-scoped 或-scoped拦截器,并同时设置and in ,更新in 。Session
SessionFactory
createDate
updateDate
onSave(...)
updateDate
onFlushDirty(...)
更新:我将在下面留下我原来的建议,但我认为正确的方法(应该是我最初的答案)是使用拦截器或事件架构。
您可以使用 的generated
属性分别在插入和插入和更新时由数据库timestamp
获取creationDate
和生成:updateDate
<class name="MyEntity" table="MY_ENTITY">
<id .../>
<timestamp name="createDate" generated="insert" ... />
<timestamp name="updateDate" generated="always" ... />
...
</class>
有关完整详细信息,请参阅有关生成的属性的部分。
似乎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
默认值的东西会很好地工作。但是可能不需要触发器...
为了避免触发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
,在数据库级别使用默认值。
请参阅此答案的顶部...
当实体更改时,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
。