一.获取对象
load()和get()方法的不同
1.获取失败处理方式不同
session.get()无法在数据库中找到记录的话,get()方法将会返回null,而load()方法将会抛出找不到对象的异常。
2.返回类型不同
get()返回的是一个对象的实例,
性能上更加优异
而load()返回的是该对象的代理,这个代理是只含有对象标识符的空对象,只用真正用到该对象的内容时,hibernate才会想数据库发送select请求,获取真实的对象。
注意 session对象关闭时 在试图获取真实对象时,会抛出异常。。。。。
二.保存对象
1.persist方法无返回值,而save()方法将会返回对象的标识符
2.persist只能保存暂态对象和持久化对面,如果保存了游离态对象和移除态对象将会抛出异常
三.更新对象
获取了持久化对象或者游离态对象时,我们往往可以用update()方法修改该对象的数据库记录
但是我们也可以不显示调用update()方法,hibernate提供了智能脏数据检测可以进行脏数据检测,
注意保存了更新游离态对象后,游离态对象变成持久态对象
四.合并对象
merge(class)
合并对象主要是把游离态对象合并到工作单元当中,然后把游离态对的内容更新到数据库对应的表格中。
合并的前提是首先在上下文中寻找标识符相同的对象,如果没有找到,则会向数据库发出请求,使用游离态对象的标识符载入一个新的持久化对象
到上下文中,然后把游离态对象的属性赋值过去。
如果在上下文中找到标识符相同的持久化对象,则会合并游离态的内容到该持久化对象中
五.删除对象
delete()
删除暂态对象不做操作,删除持久化对象和游离态对象将会删除数据库记录,删除移除态对象将会抛出异常
六.处理游离态对象
1.生成游离态对象:
session.close()隐式生游离态对象
session.evict(Object)显示的把某个实体对象清除持久化上下文,该对象成为游离态对象
session.clear()清除上下文所有的持久化对象
2.利用游离态对象复制对象
Session接口中提供了replicate方法来完成这项工作
Session session1=sf.openSession();
Transaction transaction1=session.beginTransaction();
Book book1=session.get(Book.class,1);
transaction1.commit();
session1.close();
此时得到了游离态对象book1
Session session2=sf.openSession();
Transaction transaction2=session.beginTransaction();
session.replicate(book,ReplicateMode.OVERWRITER);
t2.commit();
session2.close();
EXCEPTION 存在标识符相同的对象将会抛出异常
IGNORE 存在标识符相同的对象将会取消复制
OVERWRITER 存在标识符相同的对象将会覆盖该对象
LATEST_VERSION 复制过程中如果存在标识符相同的对象,将会比较两个对象版本号,游离态版本大的对象将会被复制
不然复制过程将会被取消
3.重新绑定游离态对象
1.update() 2.merge()
session.lock(book,LockMode.NODE)
七.辅助对象管理
Contains(Object)如果处于session上下文持久化范围内,返回true
getIdentifier(Object)如果处于session上下文持久化范围内,返回对象标识符
refresh(Object)从数据库中重新读取该对象的状态
refresh(Object,LockMode)从数据库中重新读取该对象的状态并且使用给定的模式锁定该对象
八.其他方法:
1.管理连接
connection()返回session相关联的数据库连接
isConnection()返回true
isOpen()
isDirty()是否含有变化的对象
close()
2.管理缓存
setCacheMode(CacheMode)
NORMAL 从二级缓存中读取,并把对象写入缓存
IGNORE 除非希望设置对象无效,否者session不与二级缓存进行交流
GET 从二级缓存中读取对象,不写入,除非更新数据
PUT 写入二级缓存,但不读取对象
REFRESGH 类似PUT 但是会强势从数据库更新对象状态
默认为NORMAL
。。