一.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 相同的对象!