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 ...
随机推荐
- rtp h264注意点(FU-A分包方式说明)
前写过一篇文章,分析了h264使用rtp进行封包的格式介绍:RTP封装h264.但里面好像没有把拆分以及一些需要注意的情况说清楚,因此这里做补充,也作为自己的备忘(自己记性好像不太好). 关于时间戳, ...
- VS2010下编译安装DarwinStreamingServer5.5.5
源码下载链接:http://dss.macosforge.org/源码版本: 5.5.5版本电脑环境:visual studio2010,window 7 x64系统.用VS2010打开WinNTSu ...
- Darwin Streaming Server用vs2005编译运行过程
原创. 一:编译 Darwin6.0.3版本是最新版本,也提供了.dsw文件.但是使用vs2005和vc6是编译不过的.所以,采用Darwin5.5.5版本.使用vc6打开WinNTSupport文件 ...
- linux中waitpid及wait的用法
wait(等待子进程中断或结束) 表头文件 #include<sys/types.h> #include<sys/wait.h> 定义函数 pid_t wa ...
- UML类图设计
大纲: 在Visio里,包和类的关系是包含关系,将类拖入包的文件夹之后,关系就建立了,二元关联符号可以设置为:聚合.合成.接口:空心圆+直线(唐老鸭类实现了‘讲人话’):依赖:虚线+箭头(动物和空气的 ...
- HDU 5387 Clock
题意:给一个时间,求三个时针之间的夹角,分数表示. 解法:算算算.统一了一下分母. 代码: #include<stdio.h> #include<iostream> #incl ...
- Oracle数据库启动时:ORA-00119: invalid specification for system parameter LOCAL_LISTENER; ORA-00132错误解决
问题描述: 1. em打开中提示 https://localhost:1158/em/console/database/instance/repDown?target=orclweng&typ ...
- [Papers]NSE, $\p_3u$, Lebesgue space [Penel-Pokorny, AM, 2004]
$$\bex \p_3\bbu\in L^p(0,T;L^q(\bbR^3)),\quad \frac{2}{p}+\frac{3}{q}=\frac{3}{2},\quad 2\leq q\leq ...
- 分布式发布订阅消息系统 Kafka 架构设计
我们为什么要搭建该系统 Kafka是一个分布式.分区的.多副本的.多订阅者的“提交”日志系统. 我们构建这个系统是因为我们认为,一个实现完好的操作日志系统是一个最基本的基础设施,它可以替代一些系统来作 ...
- 解决Windows 7删除执行过的 EXE、Bat文件有延迟的问题
解决了困扰已久的问题,真是大快人心啊! Win7删除exe文件刷新重现及删除慢问题解决方法 - DragonCheng的专栏 - 博客频道 - CSDN.NET Win7删除exe文件刷新重现及删除慢 ...