Hibernate中的session对象update方法的使用
使一个游离对象转变为持久化对象。例如以下代码在session1中保存了一个Customer对象,然后在session2中更新这个Customer对象:
Customer customer = new Customer();
customer.setName("Tom");
Session session1 = sessionFactory.buildSession();
Transaction tx1 = session.beginTransaction();
session1.save(customer);
tx1.commit();
session1.close();
Session session2 = sessionFactory.openSession();
Transaction tx2 = session2.beginTransaction();
customer.setName("Linda"); // 在和session2关联之前修改Customer对象的属性
session2.update(customer);
customer2.setName("Jack"); // 在和session2关联之后修改Customer对象的属性
tx2.commit();
session2.close();
Session的update()方法完成以下操作:
(1)把Customer对象重新加入到Session的缓存中,使它变为持久化对象。
(2)计划执行一个update语句。值得注意的是,Session只有在清理缓存的时候才会执行update语句,并且在执行时才会把Customer对象当前的属性值组装到update语句中。因此,即使程序中多次修改了Customer对象的属性,在清理缓存时只会执行一次update语句。以下两段代码是等价的,无论是左边的代码,还是右边的代码,Session都只会执行一条update语句:
|
...... Session session2 = sessionFactory.openSession(); Transaction tx2 = session2.beginTransaction(); customer2.setName("Linda"); session.update(customer); customer.setName("Jack"); tx2.commit(); session2.close(); |
...... Session session2 = sessionFactory.openSession(); Transaction tx2 = session1.beginTransaction(); session2.update(customer); customer.setName("Linda"); customer.setName("Jack"); txt2.commit(); session2.close(); |
以上代码尽管把Customer对象的name属性修改了两次,但Session在清理缓存时,根据Customer对象的当前属性值来组装update语句,因此执行的update语句为:
update CUSTOMERS set name='Jack' ...... where ID=1;
只要通过update()方法使游离对象被一个Session关联,即使没有修改Customer对象的任何属性,Session在清理缓存时也会执行由update()方法计划的update语句。例如以下程序使Customer对象被session2关联,但是没有修改Customer对象的任何属性:
// 此处省略session1持久化Customer对象的代码
Session session2 = sessionFactory.openSession();
Transaction tx2 = session2.beginTransaction();
session.update(customer);
txt2.commit();
session2.close();
Session在清理存缓时,会执行由update()方法计划的update语句,并且根据Customer对象的当前属性来组装update语句:
update CUSTOMERS set name='Tom' ...... where ID=1;
如果希望Session仅仅当修改了Customer对象的属性时,才执行update语句,可以把映射文件中<class>元素的select-before-update设为true,该属性默认值为false:
<class name="Customer" table="CUSTOMERS" selecet-before-update="true">
如果按以上方式修改了Customer.hbm.xml文件,当Session清理缓存时,会先执行一条select语句:
select * from CUSTOMERS where ID=1;
然后比较Customer对象的属性是否和从数据库中检索出来的记录一致,只有在不一致的情况下,才执行update语句。
应用根据实际情况来决定是否应该把select-before-update设为true。如果Java对象的属性不会经常变化,可以把select-before-update属性设为true,避免Session执行不必要的update语句,这样会提高应用程序的性能。如果需要经常修改Java对象的属性,就没必要把这个属性设为true,因为它会导致在执行update语句之前,执行一条多余的select语句。
当update()方法关联一个游离对象时,如果在Session的缓存中已经存在相同OID的持久化对象,会抛出异常。例如以下代码通过session2加载了OID为1的Customer对象,接下来又试图把一个OID为1的Customer游离对象加入到session2的缓存中:
// 此处省略session1持久化Customer对象的代码
......
Session session2 = sessionFactory.openSession();
Transaction tx2 = session2.beginTransaction();
// session2加载一个OID为1的Customer持久化对象
Customer anotherCustomer = (Customer)session2.load(Customer.class, new Long(1));
// 把一个OID为1的Customer游离对象加入到session2的缓存中
session2.update(customer);
tx2.commit();
session2.close();
当执行session2的update()方法时,由于session2的缓存中已经存在了OID为1的Customer持久化对象,因此不允许把OID为1的Customer游离对象再加入到session2的缓存中,Session在运行时会抛出异常。此外,当update()方法关联一个游离对象时,如果在数据库中不存在相应的记录,也会抛出异常。
Hibernate中的session对象update方法的使用的更多相关文章
- Hibernate中的Session对象 标签: hibernatesession 2017-01-22 22:10 238人阅读 评论(
Hibernate中的Session 大家在看hibernate视频的时候一定都发现了,每次要操作数据库,总是要新建一个session对象,Hibernate在对资料库进行操作之前,必须先取得Sess ...
- hibernate中的session的获取方法以及区别
获取sesstionFactory的方法: // sessionFactory factory = new AnnotationConfiguration.configure("hibern ...
- 在hibernate中查询单个对象的方法,get()、load()、
查询单个对象可以直接通过Session对象来做到,其中session这个对象提过了2种获得单个对象的方法,一个是get方法和load方法,我去看这个两个方法的时候发现这两个方法的参数是一样的,使用方式 ...
- Hibernate Session对象核心方法
1. 持久化对象的状态: 站在持久化的角度,Hibernate 把对象分为四种状态:持久化状态,临时状态,游离状态,删除状态 Session 的特定方法能使对象从一个状态转到另一个状态 临时对象: 在 ...
- Hibernate中evict方法和clear方法说明
Hibernate中evict方法和clear方法说明 先创建一个对象,然后调用session.save方法,然后调用evict方法把该对象清除出缓存,最后提交事务.结果报错: Exception i ...
- 第四讲 :hibernate中的session
hibernate中的session中可以进行增删改差,通过工具类可以得到相关的工具类. 方法概要: Transaction beginTransaction()开始一个工作单元,得到关联的事务对象 ...
- Hibernate中的Session
我们之前也经常使用Session,通过连接服务器将需要保存的值存到服务器的session中,这是之前关于session的简单应用.现在看到Hibernate框架中也有关于Session的定义,该定义是 ...
- 关于hibernate中的session与数据库连接关系以及getCurrentSession 与 openSession() 的区别
1.session与connection,是多对一关系,每个session都有一个与之对应的connection,一个connection不同时刻可以供多个session使用. 2.多个sessi ...
- (八) Hibernate中的Session以及事务
HibernateUtil.getSessionFactory().getCurrentSession() 和HibernateUtil.getSession() 的区别: 1.异:getCurren ...
随机推荐
- ECSHOP seo修改建议
ECSHOP是一个非常优秀的商城程序,以丰富的模板.稳定开源.非常快的执行速度赢得广大网店主的青眯.可是新建站30多天,目前百度只收录了首页,而google收录正常.我检查了他的网站一切正常,没有任何 ...
- 2.Linq实用性技巧篇
在论坛上经常会看到别人问,linq怎么实现递归,如何求笛卡尔积等问题..都可以用linq快速方便的解决..下面我就来个总的归纳 1.)递归 我们经常会遇到一个情况,就是想获取当前节点下的所有子节点.比 ...
- Android UI开发详解之Fragment
Fragment是Android自从3.0之后新加入的一个组件,我相信很多人都已经听说过这个组件了,但这个组件到底是个什么,如何去使用他呢,且听我讲来. 以下部分资料来自官网(官网才是王道,其他都是浮 ...
- 炮兵阵地(POJ 1185状压dp)
题意:n*m地图'H'能放'p'不能放,布兵的方格上下左右不能布兵,给你地图求最大布兵数 分析:关系到前两行,所以dp[i][j][k]第i行状态为j,i-1行状态为k时的最大布兵数, 先求出所有可行 ...
- 《Python基础教程(第二版)》学习笔记 -> 第十章 充电时刻 之 标准库
SYS sys这个模块让你能够访问与Python解释器联系紧密的变量和函数,下面是一些sys模块中重要的函数和变量: 函数和变量 描述 argv 命令行参数,包括脚本和名称 exit([arg]) ...
- 在/proc文件系统中增加一个目录hello,并在这个目录中增加一个文件world,文件的内容为hello world
一.题目 编写一个内核模块,在/proc文件系统中增加一个目录hello,并在这个目录中增加一个文件world,文件的内容为hello world.内核版本要求2.6.18 二.实验环境 物理主机:w ...
- 【跟我一起学Python吧】Python的包管理工具
刚开始学习Python时,在看文档和别人的blog介绍安装包有的用easy_install, setuptools, 有的使用pip,distribute,那麽这几个工具有什么关系呢,看一下下面这个图 ...
- HDU5780 gcd 欧拉函数
http://acm.hdu.edu.cn/showproblem.php?pid=5780 BC #85 1005 思路: 首先原式化简:x^gcd(a,b)−1 也就是求n内,(公约数是i的 ...
- anaconda在linux下的安装注意事项
不应该做什么 官网原文: Installation Instructions Linux Install These instructions explain how to install Anaco ...
- Delimiter must not be alphanumeric or backslash 问题及解决
Warning: preg_match() [function.preg-match]: Delimiter must not be alphanumeric or backslash in 正则表达 ...