Hibernate session.saveOrUpdate()方法
saveOrUpdate()方法同时包含了save()与update()方法的功能,
如果传入的参数是临时对象,就调用save()方法;
如果传入的参数是游离对象,就调用update()方法;
如果传入的参数是持久化对象,那就直接返回。
那么,saveOrUpdate()方法如何判断一个对象处于临时状态还是游离状态呢?如果满足以下情况之一,Hibernate就把它作为临时对象。
Java对象的OID取值为null。
Java对象具有version属性并且取值为null。
在映射文件中为元素设置了unsaved-value属性,并且IOD取值与unsaved-value属性值匹配。
在映射文件中为version属性设置了unsaved-value属性,并且version属性取值与unsaved-value属性值匹配。
自定义了Hibernate的Interceptor实现类,并且Interceptor的isUnsaved()方法返回Boolean.TRUE。
在以下程序中,customer起初为游离对象,anotherCustomer起初为临时对象,session2的saveOrUpdate()方法分别将它们变为持久化对象:
// 此处省略session1持久化Customer对象的代码
......
Session session2 = sessionFactory.openSession();
Transaction tx2 = session2.beginTransaction();
Customer anotherCustomer = new Customer();
anotherCustomer.setName("Tom");
session2.saveOrUpdate(customer); // 使customer游离对象被session2关联
session2.saveOrUpdate(anotherCustomer); // 使anotherCustomer临时对象被session2关联
tx2.commit();
session2.close();
如果Customer类的id属性为java.lang.Long类型,它的默认值为null,那么session2很容易就判断出customer对象为游离对象,而anotherCustomer对象为临时对象。因此session2对customer对象执行update操作,对anotherCutomer对象执行insert操作。
如果Customer类的id属性为long类型,它的默认值为0,此时需要显示设置<id>元素的unsaved-value属性,它的默认值为null:
<id name="id" column="ID" unsaved-value="0">
<genarator class="Custoer"/>
</id>
这样,如果Customer对象的id取值为0,Hibernate就会把它作为临时对象
Hibernate session.saveOrUpdate()方法的更多相关文章
- Hibernate 的saveOrUpdate方法(转)
hibernate提供了saveOrUpdate的方法来进行数据库的操作.hibernate会根据对象的状态决定是insert还是update,其根本是通过xml文件中unsaved-value来确定 ...
- [原创]java WEB学习笔记79:Hibernate学习之路--- 四种对象的状态,session核心方法:save()方法,persist()方法,get() 和 load() 方法,update()方法,saveOrUpdate() 方法,merge() 方法,delete() 方法,evict(),hibernate 调用存储过程,hibernate 与 触发器协同工作
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Hibernate中对象的三种状态以及Session类中saveOrUpdate方法与merge方法的区别
首先,用一张图说明一个对象,在Hibernate中,在调用了不同方法之后对象所处的不同状态 在Hibernate中,一个对象的状态可以被分为如图所示的三种 Transient:瞬时对象,该对象在数据库 ...
- Hibernate Session中的save(),update(),delete(),saveOrUpdate() 细粒度分析
Hibernate在对资料库进行操作之前,必须先取得Session实例,相当于JDBC在对资料库操作之前,必须先取得Connection实例, Session是Hibernate操作的基础,它不是设计 ...
- hibernate save,update,saveorupdate方法有什么区别
save肯定是添加的时候用,update修改时候用,saveorupdate是添加或修改,如果真是这样save和update的存在就没意义了,我们直接saveorupdate就行了. save在添加用 ...
- Hibernate Session对象核心方法
1. 持久化对象的状态: 站在持久化的角度,Hibernate 把对象分为四种状态:持久化状态,临时状态,游离状态,删除状态 Session 的特定方法能使对象从一个状态转到另一个状态 临时对象: 在 ...
- Hibernate(5)session的方法
1. Session缓存 Session缓存(Hibernate一级缓存),在 Session 接口的实现中包含一系列的 Java 集合, 这些 Java 集合构成了 Session 缓存.只要 Se ...
- Hibernate框架session的方法
package Test; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernat ...
- Hibernate saveOrUpdate方法到底是怎么执行的?
saveOrUpdate方法,如果传入的对象有主键就执行更新,没有就执行新增.这句话误导了很多人. 究竟是执行新增还是更新,是要有上下文环境的.这个环境就是主键策略的选择. 主键生成方式为 手动设置: ...
随机推荐
- 《github一天一道算法题》:插入排序
看书.思考.写代码! /*********************************************** * copyright@hustyangju * blog: http://bl ...
- 树形dp-hdu-4714-Tree2cycle
题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4714 题目意思: 给一棵树,去掉一条边和增加一条边的花费都为1,求最小的花费,使该树变成一个环. 解 ...
- UITabBarController 笔记(二) ViewController中加UITabBarController
新建一个简单视图iOS工程,在ViewController的viewDidLoad中代码如下 - (void)viewDidLoad { [super viewDidLoad]; // Do any ...
- BZOJ 2186 SDOI2008 沙拉公主的困惑 数论
题目大意:给定询问组数T和取模数P,每次询问给定两个整数n和m,求1~(n!)的数中与m!互质的数个个数模P (m<=n) 首先T<=1W,暴力肯定过不去,我们须要预处理一些东西 首先我们 ...
- 排序算法 -- 数据结构与算法的javascript描述 第12章
排序是常见的功能,给定一组数据,对其进行排序. 在此之前,我们需要准备个基础工作--自动生成数组,并可以对该组数据做任何处理. /** * 测试类 ,数组 * @param numElements * ...
- C#中的USB库 WinUSB
NET C#中的USB库WinUSB,的libusb - Win32和的libusb - 1.0.使用公共设备类,应用程序与所有未经修改的操作系统和驱动程序.大量的示例代码. http://sourc ...
- 关于中文乱码的解决方法(URL方式)
假设keyWord ='阳光'; url="play.jsp? keyWord ="+ keyWord 若按照上述的地址直接访问,则中文会变成乱码.必须使用encodeURI()进 ...
- java获得平台相关的行分隔符和java路径分隔符的方法
System.getProperties(): 行分隔符在windows 下是 \r\n,在Linux下面是 \n, 在Mac下是 \r路径分隔符在windows下是 \ ,在LInux下是 / Sy ...
- Android 监听器
Android提供很多种事件监听器,监听器主要是为了相应某个动作,可以通过监控这种动作行为,来完成我们需要的程序功能. OnItemClickListener: ...
- Git存储用户名和密码(明文需谨慎)
当你配置好git后,在C:\Documents and Settings\Administrator\ 目录下有一个 .gitconfig 的文件,里面会有你先前配好的name 和email,只需在下 ...