我正在使用Hibernate与 Xml 映射。我有一个实体有两个字段 creationDate 和 updateDate 类型timestamp
,当实体被持久化和更新时,必须用当前的UTC时间填充。
我知道@PrePersist
和@PreUpdate
注释的存在,但我不知道如何在我的Xml映射中使用它们的等价物。
再次,我想知道Hibernate是否以某种方式支持本地更新和创建时间设置。
由于
答案 0 :(得分:9)
我知道
@PrePersist
和@PreUpdate
注释的存在,但我不知道如何在我的Xml映射中使用它们的等价物。
Hibernate3 event architecture提供了相同的功能,您可以注册PreInsertEvent
,PreUpdateEvent
或SaveOrUpdateEvent
的侦听器(有关完整列表,请参阅org.hibernate.event
包)设置和更新创建/更新日期。
另一种方法是使用interceptor,Session
- 作用域或SessionFactory
- 作用域,并在{{createDate
和updateDate
中设置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部分。
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
之类的内容作为默认值可以很好地运行。但触发器可能不是通缉......
要避免触发选项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相同,在数据库级别使用默认值。
请参阅此答案的顶部...
答案 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
之后。