您的位置:首页 > 其它

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 相同的对象!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: