session(回话)接口
1.Session一个实例代表与数据库的一次操作(当然一次操作可以是crud组合)
2.Session实例通过SessionFactory获取,用完需要关闭。
3.Session是线程不同步的(不安全),因此要保证在同一线程中使用,可以用getCurrentSessiong()。
4.Session可以看做是持久化管理器,它是与持久化操作相关的接口
代码举例(前边我们也是用过了):
Configuration cf=new Configuration().configure();
SessionFactory sf=cf.buildSessionFactory();
Session s=sf.getCurrentSession();
//或者是: Session s=sf.openSession();
Session一般以对象的形式来操作,主要是CRUD(save delete update load/get)
注意前几个都没什么问题,现在就是查询的时候的两种方式load和get的区别是什么呢
1.get()方法直接返回实体类,如果查不到数据则返回null。load()会返回一个实体代理对象(当前这个对象可以自动转化为实体对象), 但当代理对象被调用时,如果没有数据不存在,就会抛出org.hibernate.ObjectNotFoundException异常
2.load先到缓存(session缓存/二级缓存)中去查,如果没有则返回一个代理对象(不马上到DB中去找),等后面使用这个代理对象操作的时候,才到DB中查询,这就是我们常说的 load在默认情况下支持延迟加载(lazy)
但是get先到缓存(session缓存/二级缓存)中去查,如果没有就到DB中去查(即马上发出sql)
因此,如果确定DB中有这个对象就用load(),不确定就用get(),这样的话效率是最高的
<class name="Employee" lazy="false" table="employee">
我们可以通过这行代码取消懒加载,这样懒加载就会被禁用,系统默认是true
这样我们有看出了hibernate的好处,通过session缓存和二级缓存大大减少了对数据库的平凡访问,提高了效率,这也是hibernate的好处之一
我们现在写一个session的工具类,似的它可以直接返回全新的session和线程相关的session(之前写的MySessionFactory只能生成全新的session),代码如下:
package com.cyj.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
final public class HibernateUtil { //SqlHelper
private static SessionFactory sessionFactory=null;
//使用线程局部模式
private static ThreadLocal<Session> threadLocal=new ThreadLocal<Session>();
private HibernateUtil(){};
static {
sessionFactory=new Configuration().configure().buildSessionFactory();
}
//获取全新的全新的sesession
public static Session openSession(){
return sessionFactory.openSession();
}
//获取和线程关联的session
public static Session getCurrentSession(){
Session session=threadLocal.get();
//判断是否得到
if(session==null){
session=sessionFactory.openSession();
//把session对象设置到 threadLocal,相当于该session已经和线程绑定
threadLocal.set(session);
}
return session;
}