hibernate区分瞬时实例和分离实例

本文介绍了Hibernate将实例视为未保存的瞬时实例的几种情况,如标识符或版本属性为null等。还提到业务模型中使用可空的java.lang.Long作标识符属性类型可解决问题,若用原始long类型,需在类中使用特定标识符映射,unsaved - value属性可指定瞬时实例的标识符值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于Hibernate 不保留对分离实例的引用,Hibernate会把一个实例认为是未保存的瞬时实例,如果:
1.标识符属性(如果存在)为null。
2. 版本属性(如果存在)为null。
3.在类的映射文档中支持unsaved-value及标识符属性匹配的值。
4.在类的映射文档中支持unsaved-value及版本属性匹配的值。
5. 支持Hibernate Interceptor 并在代码中检查完实例后从Interceptor.isUnsaved()返回Boolean.TRUE。
在我们的业务模型中,已经到处使用过可空的类型java.lang.Long作为标识符属性类型。由于我们正在使用生成的复合标识符,这就可以解决问题。新的实例有空的标识符属性值,因此Hibernate认为它们是瞬时的。分离的实例有非空的标识符值,Hibernate也会正确的对待它们。

然而,如果在持久类中使用原始的long 类型,就需要在所有的类中使用下面的标识符映
射:
<class name="Category" table="CATEGORY">
<id name="id" unsaved-value="0">
<generator class="native"/>
</id>
....
</class>
unsaved-value属性告诉Hibernate把具有标识符值为0的Category实例当作新初始化的瞬时实例。unsaved-value 属性的默认值为null,因此,由于我们选择Long 为标识符属性类型,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值