Mar*_*ark 5 orm hibernate hbm hibernate-mapping
我正在使用Hibernate和Xml映射.我有一个实体有两个字段creationDate和updateDate类型timestamp,当实体被持久化和更新时,必须填充当前的UTC时间.我知道@PrePersist和@PreUpdate注释的存在,但我不知道如何在我的Xml映射中使用它们的等价物.
再一次,我想知道Hibernate是否以某种方式支持本地更新和创建时间设置.
谢谢
我知道
@PrePersist和@PreUpdate注释的存在,但我不知道如何在我的Xml映射中使用它们的等价物.
Hibernate3 事件体系结构提供了等效的东西,您可以注册侦听器PreInsertEvent,PreUpdateEvent或者SaveOrUpdateEvent(查看org.hibernate.event包的完整列表)来设置和更新创建/更新日期.
另一种方法是使用拦截器,无论是Session-scoped还是SessionFactory-scoped,并设置两者createDate和updateDatein onSave(...),更新updateDatein onFlushDirty(...).
更新:我将在下面留下我的原始建议,但我认为正确的方法(应该是我最初的答案)是使用拦截器或事件架构.
您可以在插入和插入和更新时分别使用数据库获取和生成的generated属性:timestampcreationDateupdateDate
<class name="MyEntity" table="MY_ENTITY">
<id .../>
<timestamp name="createDate" generated="insert" ... />
<timestamp name="updateDate" generated="always" ... />
...
</class>
Run Code Online (Sandbox Code Playgroud)
有关完整详细信息,请参阅生成属性部分.
它似乎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>
Run Code Online (Sandbox Code Playgroud)
在数据库级别,这将需要使用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>
Run Code Online (Sandbox Code Playgroud)
与选项1相同createDate,使用数据库级别的默认值.
看到这个答案的顶部......
| 归档时间: |
|
| 查看次数: |
9421 次 |
| 最近记录: |