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方法,如果传入的对象有主键就执行更新,没有就执行新增.这句话误导了很多人. 究竟是执行新增还是更新,是要有上下文环境的.这个环境就是主键策略的选择. 主键生成方式为 手动设置: ...
随机推荐
- #include <sstream>
1 std::istringstream 2 std::stringstream 1 std::istringstream input 1 在一个字符串string里提取部分数据,这些数据以空格' ' ...
- Cocos2d-x官方在线视频-Cocos2d-x3.2《2048》手游开发揭秘
Cocoachina 官方在线视频 http://cn.cocos2d-x.org/tutorial/lists?id=58 一.游戏介绍 2048游戏是一款风靡全球的休闲类游戏,通过控制4X4范围内 ...
- java 泛型深入之Set有用工具 各种集合泛型深入使用演示样例,匿名内部类、内部类应用于泛型探讨
java 泛型深入之Set有用工具 各种集合泛型深入使用演示样例,匿名内部类.内部类应用于泛型探讨 //Sets.java package org.rui.generics.set; import j ...
- SQL Server数据库---》基础
SQL Server:只是操作数据库的一个工具(这种工具,只是提供一个界面化的方式让用户方便操作数据库) 开启服务:点击:我的电脑(计算机)--管理--服务和应用程序--服务--开启SQL Serve ...
- Android快速开发不可或缺的11个工具类
Android快速开发不可或缺的11个工具类 :http://www.devst ore.cn/code/info/363.html
- LocalStorage存储
1.localStorage存储服务: .factory('storageSvc', [function () { return { //保存数据 save: function (key, valu ...
- mongodb 备份与恢复
备份 mongodump -d dbname -o backup 例如 mongodump -d student -o backup 恢复 mongorestore -d dbname -o back ...
- VI 配置文件(略全)
配置 ~/.vimrc文件. root则放到/etc/vimrc 具体详见代码 "====================================================== ...
- UDP聊天实现(简单版)
两者代码基本一致 关于套接字: 甲方: #include <stdio.h> #include <string.h> #include <netinet/in.h> ...
- 如何彻底卸载sql server 2012
好不容易装上了sql server 2012数据库,可是却不能连接本地的数据库,后来发现缺少一些服务,于是决定重新安装,但是卸载却很麻烦,如果卸载不干净的话,重新安装会出问题,所以下面就总结一些方法: ...