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

来源:互联网 发布:mac格式化u盘方案选择 编辑:程序博客网 时间:2024/06/05 23:01
由于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 为标识符属性类型,
原创粉丝点击