关于Hibernate的unsaved-value

ubuntu18.04安装xenomai3.1(百分百成功版) ubuntu18.04安装xenomai3.1(百分百成功版),保姆级教学!!! 阅读详情

unsaved-value是表示一个对象是新的还是旧的,当显式的使用session.save()或者session.update()操作一个对象的时候,实际上是用不到unsaved-value的。某些情况下(父子表关联保存),当你在程序中并没有显式的使用save或者update一个持久对象,那么Hibernate需要判断被操作的对象究竟是一个已经持久化过的持久对象,是一个尚未被持久化过的内存临时对象。例如:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> CODE:    
Session session 
=  ;    
Transaction tx 
=  ;    
Parent parent 
=  (Parent) session.load(Parent. class , id);    
Child child 
=   new  Child();    
child.setParent(parent);    
child.setName(
" sun " );    
parent.addChild(child);    
s.update(parent);    
s.flush();    
tx.commit();    
s.close();

 

在上例中,程序并没有显式的session.save(child); 那么Hibernate需要知道child究竟是一个临时对象,还是已经在数据库中有的持久对象。如果child是一个新创建的临时对象(本例中就是这种情况),那么Hibernate应该自动产生session.save(child)这样的操作,如果child是已经在数据库中有的持久对象,那么Hibernate应该自动产生session.update(child)这样的操作。3^)N%Q(}z1U        Q$x
因此我们需要暗示一下Hibernate,究竟child对象应该对它自动save还是update。在上例中,显然我们应该暗示Hibernate对child自动save,而不是自动update。那么Hibernate如何判断究竟对child是save还是update呢?它会取一下child的主键属性 child.getId() ,这里假设id是 java.lang.Integer类型的。如果取到的Id值和hbm映射文件中指定的unsave-value相等,那么Hibernate认为child是新的内存临时对象,发送save,如果不相等,那么Hibernate认为child是已经持久过的对象,发送update。`_/Zw
mV-yWr

unsaved-value="null" (默认情况,适用于大多数对象类型主键 Integer/Long/String/...)
当Hibernate取一下child的Id,取出来的是null(在上例中肯定取出来的是null),和unsaved-value设定值相等,发送save(child)
当Hibernate取一下child的id,取出来的不是null,那么和unsaved-value设定值不相等,发送update(child)
例如下面的情况:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> CODE:    
Session session 
=  ;    
Transaction tx 
=  ;    
Parent parent 
=  (Parent) session.load(Parent. class , id);    
Child child 
=  (Child) session.load(Child. class , childId);    
child.setParent(parent);    
child.setName(
" sun " );    
parent.addChild(child);    
s.update(parent);    
s.flush();    
tx.commit();    
s.close();


child已经在数据库中有了,是一个持久化的对象,不是新创建的,因此我们希望Hibernate发送update(child),在该例中,Hibernate取一下child.getId(),和unsave-value指定的null比对一下,发现不相等,那么发送update(child)。
BTW: parent对象不需要操心,因为程序显式的对parent有load操作和update的操作,不需要Hibernate自己来判断究竟是save还是update了。我们要注意的只是child对象的操作。另外unsaved-value是定义在Child类的主键属性中的。

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--> CODE:    
< class  name ="Child"  table ="child" >     
"id" name="id" type="integer" unsaved-value="null">    
  class="identity"/>    
   
    
class>

如果主键属性不是对象型,而是基本类型,如int/long/double/...,那么你需要指定一个数值型的unsaved-value,
例如:

CODE:
unsaved- null="0"


在此提醒大家,很多人以为对主键属性定义为int/long,比定义为Integer/Long运行效率来得高,认为基本类型不需要进行对象的封装和解构操作,因此喜欢把主键定义为int/long的。但实际上,Hibernate内部总是把主键转换为对象型进行操作的,就算你定义为int/long型的,Hibernate内部也要进行一次对象构造操作,返回给你的时候,还要进行解构操作,效率可能反而低也说不定。因此大家一定要扭转一个观点,在Hibernate中,主键属性定义为基本类型,并不能够比定义为对象型效率来的高,而且也多了很多麻烦,因此建议大家使用对象型的Integer/Long定义主键。
unsaved-value="none"和 悠忆社区/V,tq9fs
unsaved-value="any"
主要用在主键属性不是通过Hibernate生成,而是程序自己setId()的时候。www.yoy1.com#m4iCO'n\$T
在这里多说一句,强烈建议使用Hibernate的id generator,或者你可以自己扩展Hibernate的id generator,特别注意不要使用有实际含义的字段当做主键来用!例如用户类User,很多人喜欢用用户登陆名称做为主键,这是一个很不好的习惯,当用户类和其他实体类有关联关系的时候,万一你需要修改用户登陆名称,一改就需要改好几张表中的数据。偶合性太高,而如果你使用无业务意义的id generator,那么修改用户名称,就只修改user表就行了。
由这个问题引申出来,如果你严格按照这个原则来设计数据库,那么你基本上是用不到手工来setId()的,你用Hibernate的id generator就OK了。因此你也不需要了解当社会,体育,生活,情感,搞笑,JAVA技术交流,软件交流,IT资讯(r9j.@%u:s@4k_7P,P
unsaved-value="none"和 社会,体育,生活,情感,搞笑,JAVA,struts,hibernate技术交流,软件交流,IT资讯t;P|_0R+vy,g)z6H
unsaved-value="any"社会,体育,生活,情感,搞笑,JAVA技术交流,软件交流,IT资讯7W'N0W9W'R\
究竟有什么含义了。如果你非要用assigned不可,那么继续解释一下:b i9d e1W[B
unsaved-value="none" 的时候,由于不论主键属性为任何值,都不可能为none,因此Hibernate总是对child对象发送update(child)社会,体育,生活,情感,搞笑,JAVA,struts,hibernate技术交流,软件交流,IT资讯 C5pm
x.o:o

unsaved-value="any" 的时候,由于不论主键属性为任何值,都肯定为any,因此Hibernate总是对child对象发送save(child)社会,体育,生活,情感,搞笑,JAVA技术交流,软件交流,IT资讯G.H#n&WK6WZYWB
大多数情况下,你可以避免使用assigned,只有当你使用复合主键的时候不得不手工setId(),这时候需要你自己考虑究竟怎么设置unsaved-value了,根据你自己的需要来定。
强烈不建议使用composite-id,强烈建议使用UserType。
因此,如果你在系统设计的时候,遵循如下原则:Y?GS*w
OKYw

1、使用Hibernate的id generator来生成无业务意义的主键,不使用有业务含义的字段做主键,不使用assigned。社会,体育,生活,情感,搞笑,JAVA,struts,hibernate技术交流,软件交流,IT资讯:EOs7Z$P"`6h
2、使用对象类型(String/Integer/Long/...)来做主键,而不使用基础类型(int/long/...)做主键社会,体育,生活,情感,搞笑,JAVA,struts,hibernate技术交流,软件交流,IT资讯\MJ%d\b
TI

3、不使用composite-id来处理复合主键的情况,而使用UserType来处理该种情况。
#yo9LLlU a
那么你永远用的是unsaved-value="null" ,不可能用到any/none/..了。

金融波动率的“捕手”:GARCH模型,揭秘市场波动的“聚集密码” 摘要: GARCH模型(广义自回归条件异方差)是金融时间序列分析中用于捕捉“波动聚类”现象的核心工具。传统模型(如ARIMA)无法刻画金融数据的时变波动特性,而GARCH通过建模条件方差的动态变化(如$\sigma_t^2 = \omega + \alpha \varepsilon_{t-1}^2 + \beta \sigma_{t-1}^2$),精准预测波动率。Python实战显示,GARCH能有效拟合模拟金融数据的波动聚类,残差无自相关,验证了其优越性。该模型在波动率预测、风险价值(VaR)计算和期权定 阅读详情

相关推荐

Pytorch的一小步,昇腾芯片的一大步

相信在AI圈的人多多少少都看到了最近的信息:PyTorch最新2.1版本宣布支持华为昇腾芯片!

机器学习-深度学习-图像处理-opencv-段子 5245

About unsaved-value [resource : javaeye]

当你显式的使用session.save()或者session.update()操作一个对象的时候,实际上是用不到unsaved-value的。某些情况下(父子表关联保存),当你在程序中并没有显式的使用save或者update一个持久对象,那么Hibernate需要判断被操作的对象究竟是一个已经持久化过的持久对象,是一个尚未被持久化过的内存临时对象。例如: java代码: 

1152

十五天学会Autodesk Inventor,看完这一系列就够了(七),工程图纸

不管哪种绘图软件,二维或三维绘图,最终均需要转换成工程图纸,才能交给现场人员进行制作,这是任一产品图都要经历的过程。那本章开始,我们一起看一下Inventor是如何实现工程图纸?

Crazydoubao的博客 4915

saveorUpdate与unsaved-value,save,update,delete

这些操作对经常使用hibernate的同学已经很熟悉了,我也经常用但一些细节并不了解,最近遇到问题才开始有看了一下。在读完robbin的这两个精华贴的时候,感觉清晰了很多,确实好文章。http://www.javaeye.com/topic/2712http://www.javaeye.com/topic/1604?page=1还有这个精华贴http://www.javaeye.com/t

Raymond.LEE 830

3线SWD接线终极指南:用Jlink调试非3.3V设备的5个关键细节

本文详细解析了使用Jlink调试非3.3V设备时,3线SWD接线的5个关键细节。核心在于正确理解并连接Vref引脚以实现电压适配,避免供电冲突,并掌握精简接线法与固件修复技巧。文章以STM32F205等芯片为例,指导开发者安全、高效地进行混合电压调试。

e4f5g6h7的博客 440

【智能机器人开发全流程:硬件选型、软件架构与ROS实战,打造高效机器人系统】

通过模块化设计与ROS框架的灵活扩展,可快速搭建适应不同场景的机器人系统。实际开发中需重点关注。

dally2的博客 6049

Hibernate的saveOrUpdate方法以及unsaved-value属性

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

镜花水月 247

智能Agent如何重塑企业流程

在当今数字化时代,企业流程的效率和敏捷性至关重要。传统企业流程往往受限于人工操作,效率低下、成本高昂,难以适应快速变化的市场环境。智能Agent作为一种新兴技术,凭借其强大的智能化能力,正在逐渐改变企业流程的运作模式,为企业带来新的机遇和挑战。智能Agent是一种能够感知环境、自主决策、执行任务的软件实体。它可以模拟人类的智能行为,例如学习、推理、规划和沟通。通过将智能Agent嵌入到企业流程中,可以实现流程的自动化、优化和智能化,从而提高效率、降低成本、提升客户体验。8.1 研究成果总结。

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 874

Hibernate 中的 unsaved-value 的重要性

由有本人刚学习 Hibernate 不就,不是很明白这里面的道理,故先记录下:先将这个示例说说:create table category (  catid char(10) not null,  name varchar(80) null,  descn varchar(255) null,  constraint pk_category primary key (catid)) type=In

小瑜儿温暖阳光专栏 2597

metahuman 下载材质 脸部灰白 脸部过亮

metahuman 下载材质 脸部灰白 脸部过亮

jacke121的专栏 247

微信服务号配置总是提示“参数错误”?我就是这样一步步查出问题的

前两天,我遇到了一个很诡异的问题:在微信服务号后台配置服务器地址时,总是提示“参数错误,请重新填写”。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1279

关于unsaved-value 的再问

关于unsaved-value 的再问。作者:robbin (MSN:robbin_fan AT hotmail DOT com)版权声明:本文严禁转载,如有转载请求,请和作者联系ywang的提问:unsaved-value是表示一个对象是新的还是旧的,如果unsaved-value=none 那么就是新的,就会被insert到数据库中,如果unsaved-value=any 就是

Eric.Jonah! 1074

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

hibernate中unsaved_value的作用

 当你显式的使用session.save()或者session.update()操作一个对象的时候,实际上是用不到unsaved-value的。某些情况下(父子表关联保存),当你在程序中并没有显式的使用save或者update一个持久对象,那么Hibernate需要判断被操作的对象究竟是一个已经持久化过的持久对象,是一个尚未被持久化过的内存临时对象。例如: 代码

bigint6904的专栏 1167

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Hibernate的unsaved-value

导读:   当你显式的使用session.save()或者session.update()操作一个对象的时候,实际上是用不到unsaved-value的。某些情况下(父子表关联保存),当你在程序中并没有显式的使用save或者update一个持久对象,那么Hibernate需要判断被操作的对象究竟是一个已经持久化过的持久对象,是一个尚未被持久化过的内存临时对象。例如:   java代码:  

我的世界我的梦 718

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Hibernate unsaved-value

问题:unsaved-value是表示一个对象是新的还是旧的,如果unsaved-value=none 那么就是新的,就会被insert到数据库中,如果unsaved-value=any 就是说明对象是从数据库中load的,被update到数据库中。 我的问题是:unsaved-value是由我们来强制说明这个对象是新的还是旧的,那如果我把一个对象的unsaved-value设置为any,那我要n

duandian117的专栏 642

hibernate之saveOrUpdate方法以及unsaved-value属性

hibernate之saveOrUpdate方法以及unsaved-value属性

fhd001的专栏 1579

Hibernate unsaved-value配置

<br />当你显式的使用session.save()或者session.update()操作一个对象的时候,实际上是用不到unsaved-value的。某 些情况下(父子表关联保存),当你在程序中并没有显式的使用save或者update一个持久对象,那么Hibernate需要判断被操作的对象究竟是一 个已经持久化过的持久对象,是一个尚未被持久化过的内存临时对象。例如: <br />Java 代码 Session session = ...;  Transaction tx = ...;    Pa

tyb1222的专栏 1686

hibernate的unsaved-value

转自:http://www.javazy.com/contentex/20058584432.shtml 由有本人刚学习 Hibernate 不就,不是很明白这里面的道理,故先记录下: 先将这个示例说说: create table category ( catid char(10) not null, name varchar(80) null, descn var...

羅致克的专栏 206

Hibernate中的unsaved-value

当你显式的使用session.save()或者session.update()操作一个对象的时候,实际上是用不到unsaved-value的。某些情况下(父子表关联保存),当你在程序中并没有显式的使用save或者update一个持久对象,那么Hibernate需要判断被操作的对象究竟是一个已经持久化过的持久对象,是一个尚未被持久化过的内存临时对象。例如:  Java代码  

miqi770的专栏 800
上一篇: hibernate一级缓存和二级缓存的区别
下一篇: Java语法总结 - 异常
zljjava
博客等级 码龄15年 155粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值