我知道 @PrePersist 和 @PreUpdate 注释的存在,但我不知道如何在我的 Xml 映射中使用它们的等价物。
Hibernate3 event architecture 提供了等效的功能,您可以为PreInsertEvent、PreUpdateEvent 或SaveOrUpdateEvent 注册侦听器(完整列表请参见org.hibernate.event 包)来设置和更新创建/更新日期。
另一种方法是使用interceptor、Session-scoped 或SessionFactory-scoped,并在onSave(...) 中设置createDate 和updateDate,更新@987654340 中的updateDate @。
更新:我将在下面留下我最初的建议,但我认为正确的方法(应该是我最初的答案)是使用拦截器或事件架构。
您可以使用 timestamp 的 generated 属性来获取 creationDate 和 @ 987654344@分别由数据库在插入和插入更新时生成:
<class name="MyEntity" table="MY_ENTITY">
<id .../>
<timestamp name="createDate" generated="insert" ... />
<timestamp name="updateDate" generated="always" ... />
...
</class>
有关详细信息,请参阅generated properties 部分。
选项 1
timestamp 似乎不支持generatead,所以我的建议不起作用。尽管如此,仔细阅读文档后,我的理解是 timestamp 是版本控制的替代方案,我认为它不适合像 createDate 这样的字段strong> 和 updateDate (它可能适用于后者,但这不是 timestamp 的用途)。
所以我实际上仍然会使用 generated properties but 和 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
查看此答案的顶部...