hibernate学习笔记(三)

来源:互联网 发布:德罗赞最近几场数据 编辑:程序博客网 时间:2024/06/01 10:01

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();}//获取全新的全新的sesessionpublic static Session openSession(){return sessionFactory.openSession();}//获取和线程关联的sessionpublic static Session getCurrentSession(){Session session=threadLocal.get();//判断是否得到if(session==null){session=sessionFactory.openSession();//把session对象设置到 threadLocal,相当于该session已经和线程绑定threadLocal.set(session);}return session;}


0 0
原创粉丝点击