博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate unsaved-value 属性
阅读量:6444 次
发布时间:2019-06-23

本文共 1690 字,大约阅读时间需要 5 分钟。

Session的saveOrUpdate方法是由Hibernate来判断被操作对象究竟是一个持久化对象还是临时自由状态对象。这需要在对象映射文件的主键id中定义unsaved-value属性,如果不显式定义,则默认为unsaved-value=null。 

unsaved-value可以是下列几个选项: 
1)null:主键是对象类型,Hibernate判断操作对象的主键是否为null,来判断操作对象是否以被持久化,如果是,调用save方法,生成insert语句,在数据库中增加一条记录,如果不是,设置主键则直接生成update的SQL语句,发送update,如果数据库中没有那条记录则抛出异常。 
2)none:由于不论主键属性为任何值,都不可能为none,因此Hibernate总是对被操作对象发送update。 
3)any:由于不论主键属性为任何值,都肯定为any,因此Hibernate总是对被操作对象发送save,Hibernate生成主键。 
显式的使用session.save()或者session.update操作一个对象时,实际上市用不到unsaved-value的。 
在一个session中,持久化对象的变化,不需要调用update等显式语句,由flush方法就可以实现数据库表的更新。 
不同session之间的对象,也就是游离状态的对象,必须使用update显式更新数据库表。 
修改一个对象,最好的方法是使用session的load方法进行持久化,然后使用set方法实现属性的修改,一般情况下,不要使用setId方法来修改对象的主键值,避免产生意想不到的错误。 
使用Hibernate的id generator来生成无业务意义的主键,不使用有业务含义的字段作主键,不建议使用assigned。 
使用对象类型(String/Integer/Long/...)来做主键,而不使用基础类型(int/long/...)做主键

 

 

父表

 

子表

 

了解unsaved-value,需要知道如下知识点: 1.unsaved-value默认值是null
2.id的type标签属性可以标示为:   【1】基本对象类型如int,long   【2】对象类型,如Int32,Int64 3.Nhibernate保存机制:        当父对象调用save(),由于级联的关系,保存子对象,那么保存子对象的方式        到底是Upadate(已经持久化在数据库中)        还是Save(还没有持久化在数据库中,只是刚刚在内存中新new)?   如何判断是用调用upadte还是调用Save,   答案是:       用unsaved-value的值与HNibernate自动从数据库中获取的子类对象的Id进行比较,
(注意:如果没有持久化,HNibernate自动从数据库中获取的子类对象的Id的值等于null)
如果是:
【1】unsaved-value的值与子类对象的Id相等,表明没有持久化,调用save;
【2】unsaved-value的值与子类对象的Id不相等,表明已持久化,调用Update;
 
综上,
当子表id标签的type标签属性标示为:   【1】基本对象类型如int,long,需要显示明unsaved-value = 0,因为unsaved-value默认值是null,而基本对象类型如int的默认值为0,
这样使得即使子类对象还没有持久化,HNibernate自动从数据库中获取的子类对象的Id=0,
这样根据上述的Nhibernate保存机制,永远调用Upadte,不会调用save。
【2】对象类型,如Int32,Int64,不需要

 

转载地址:http://rupwo.baihongyu.com/

你可能感兴趣的文章
永中Office2012青年版下载用户反馈(节选二)
查看>>
css特效实现html表格显示部分内容,当鼠标移上去显示全部。
查看>>
oracle-rownum的理解
查看>>
我的友情链接
查看>>
使用cin.get()而不是system("pause")来避免c++程序一闪而过
查看>>
20分钟mysql入门教程
查看>>
简单的交换两个变量的数值
查看>>
Linux服务器上配置2个Tomcat或者多个Tomcat
查看>>
学习计划书
查看>>
CentOS7安装过程中,磁盘大于2T的报错处理
查看>>
第2章 多态
查看>>
2.6 相对和绝对路径 2.7 cd命令 2.8 创建和删除目录mkdir/rmdir 2.9 rm
查看>>
誉天蝉联“2014年度华为十佳培训合作伙伴”奖项
查看>>
单例模式2014-12
查看>>
【算法学习笔记】54.约瑟夫问题 模拟、逆推动规 SJTU OJ 1038 二哥的约瑟夫
查看>>
python迭代器和生成器(3元运算,列表生成式,生成器表达式,生成器函数)
查看>>
Spring Data JPA在Spring Boot中的应用
查看>>
MySQL聚集索引和非聚集索引
查看>>
反射中的 Class.forName() 与 ClassLoader.loadClass() 的区别
查看>>
Android 开发技术周报
查看>>