hibernate中的session缓存的常用方法
2015-08-01 15:31
239 查看
一.flush
使数据表中的记录和Session缓存中的对象的状态保持一致。为了保持一致,则可能会发送对应的sql语句
1.在Transaction的commit()方法中:先调用session的flush方法,再提交事务
2.flush方法可能会发送sql语句,但不会提交事务。
3.注意:在未提交事务或显示的调用session.flush()方法之前,也有可能会进行flush()操作。
1).执行HQL或QBC查询,会先进行flush()操作,以得到数据表最新的记录。
2).若记录的id是由底层数据库使用自增方式生成的,则在调用save方法时,就会发送insert语句,因为save方法后,必须保证对象的id是存在的。
二.refresh
会强制发送select语句,以使session缓存中对象的状态和数据表中对应的记录保持一致。
三.clear
清理缓存
四.save
使一个临时对象变为持久化对象
为对象分配id
在flush缓存时会发送一条insert语句
在save方法之前的id是无效的
持久化对象的id是不能被修改的
五.persist
也会执行insert操作
和save的区别:
在调用persist方法之前,若对象已经有id了,则不会执行insert,而抛出异常。
六.get vs load
1. 执行get方法:立即加载对象,
执行load方法,若不使用该对象,则不会立即执行查询操作,而返回一个代理对象
get是立即检索,load是延迟检索。
2. 若数据表中没有对应的记录
get返回null
load 若不使用该对象的任何属性,没问题,若需要初始化该对象则抛出异常
3. load方法可能会抛出LazyInitializationException 异常:在需要初始化代理对象之前已经关闭了session
七.update:
1. 若更新一个持久化对象, 不需要显示的调用 update 方法. 因为在调用 Transaction
的 commit() 方法时, 会先执行 session 的 flush 方法.
2. 更新一个游离对象, 需要显式的调用 session 的 update 方法. 可以把一个游离对象
变为持久化对象
需要注意的:
1. 无论要更新的游离对象和数据表的记录是否一致, 都会发送 UPDATE 语句.
如何能让 updat 方法不再盲目的出发 update 语句呢 ? 在 .hbm.xml 文件的 class 节点设置
select-before-update=true (默认为 false). 但通常不需要设置该属性.
2. 若数据表中没有对应的记录, 但还调用了 update 方法, 会抛出异常
3. 当 update() 方法关联一个游离对象时,
如果在 Session 的缓存中已经存在相同 OID 的持久化对象, 会抛出异常. 因为在 Session 缓存中
不能有两个 OID 相同的对象!
使数据表中的记录和Session缓存中的对象的状态保持一致。为了保持一致,则可能会发送对应的sql语句
1.在Transaction的commit()方法中:先调用session的flush方法,再提交事务
2.flush方法可能会发送sql语句,但不会提交事务。
3.注意:在未提交事务或显示的调用session.flush()方法之前,也有可能会进行flush()操作。
1).执行HQL或QBC查询,会先进行flush()操作,以得到数据表最新的记录。
2).若记录的id是由底层数据库使用自增方式生成的,则在调用save方法时,就会发送insert语句,因为save方法后,必须保证对象的id是存在的。
二.refresh
会强制发送select语句,以使session缓存中对象的状态和数据表中对应的记录保持一致。
三.clear
清理缓存
四.save
使一个临时对象变为持久化对象
为对象分配id
在flush缓存时会发送一条insert语句
在save方法之前的id是无效的
持久化对象的id是不能被修改的
五.persist
也会执行insert操作
和save的区别:
在调用persist方法之前,若对象已经有id了,则不会执行insert,而抛出异常。
六.get vs load
1. 执行get方法:立即加载对象,
执行load方法,若不使用该对象,则不会立即执行查询操作,而返回一个代理对象
get是立即检索,load是延迟检索。
2. 若数据表中没有对应的记录
get返回null
load 若不使用该对象的任何属性,没问题,若需要初始化该对象则抛出异常
3. load方法可能会抛出LazyInitializationException 异常:在需要初始化代理对象之前已经关闭了session
七.update:
1. 若更新一个持久化对象, 不需要显示的调用 update 方法. 因为在调用 Transaction
的 commit() 方法时, 会先执行 session 的 flush 方法.
2. 更新一个游离对象, 需要显式的调用 session 的 update 方法. 可以把一个游离对象
变为持久化对象
需要注意的:
1. 无论要更新的游离对象和数据表的记录是否一致, 都会发送 UPDATE 语句.
如何能让 updat 方法不再盲目的出发 update 语句呢 ? 在 .hbm.xml 文件的 class 节点设置
select-before-update=true (默认为 false). 但通常不需要设置该属性.
2. 若数据表中没有对应的记录, 但还调用了 update 方法, 会抛出异常
3. 当 update() 方法关联一个游离对象时,
如果在 Session 的缓存中已经存在相同 OID 的持久化对象, 会抛出异常. 因为在 Session 缓存中
不能有两个 OID 相同的对象!
相关文章推荐
- [odroid-pc] ubuntu12.o4编译烧写android4.0 forodroidpc
- Isomorphic Strings
- 数据库提高查询效率(较大数据)优化方法
- JavaWeb_数据传输_原
- 【ASP.NET】——AdRotator控件
- hdu5334
- POJ 2231 Moo Volume
- static的作用(c)
- 重定向控制台程序的输入输出
- 使用Facebook方法处理复杂问题
- 黑马程序员——15,String,StringBuffer,基本数据类型包装对象
- iOS中判断两个圆是否重叠
- 第七章习题G题
- (回溯法)数组中和为S的N个数
- MyEclipse优化
- 给出一棵二叉树的根节点和其中两个不同的节点求出它们最近的公共祖先节点
- win8.1升级win10后只有edge浏览器能上网该怎么办?
- 逆波兰表达式求值(Evaluate Reverse Polish Notation)
- 剑指Offer面试题15(Java版):链表中倒数第K个结点
- 网络流Dinic模板