编程开发 > JAVA > 文章内容

java基础知识总结(186)

2016-10-10编辑:ljnbset

 

1.Hibernate框架的特性

  1)一级缓存

      session对象级别的缓存,利用该session取出的对象会放到缓存中.在后续查询时,首先去缓存中寻找,没有再去数据库寻找.

      session缓存区在session关闭后销毁.session复杂维护缓存区中对象的状态.

      在使用时,为了更好发挥一级缓存,需要保障同一个线程处理中,使用同一个Session对象.

a.使用ThreadLocal对SessionUtil进行改造,将Session对象与ThreadLocal绑定.

public class HibernateUtil {

         private static ThreadLocal tl=new ThreadLocal();

         private static Configuration conf;

         private static SessionFactory factory;

static {conf=new Configuration();factory=conf.buildSessionFactory();}

public static  Session getSession(){ Session session=tl.get();

         if(session==null){ session=factory.openSession(); tl.set(session);}return session; }

         public static Session closeSession(){ Session session=tl.get(); if(session!=null){session.close();tl.set(null);

                   }return session;}}

    b.Hibernate3之后的新版本,可以使用以下方法

      首先在hibernate.cfg.xml中添加配置

     

                   thread

     

      之后使用sessionFactory.getCurrentSession()方法获取Session

 

    注意:在使用此session时,必须将session操作封装在一个transaction

  

    一级缓存的管理:

     session.evict(obj);将obj对象从当前session的一级缓存中清除.

     session.clear():清除当前session的一级缓存.

 

  2)延迟加载

    当获取一个实体对象后,实体对象并没有立刻发送SQL语句,去数据库加载数据.而是在调用对象的getXXX()方法时采取加载数据.

    支持延迟加载的方法:session.load(),query.iterator().延迟加载方法返回的对象类型,是动态代理类型.

    session.get()和session.load()方法功能是按主键做条件查询数据,区别

如下:   

    a.get()方法不支持延迟加载,load()方法支持

    b.如果数据表中没有符合的记录,get()方法返回null,load()抛异常

    c.如果数据表中有符合的记录,get()返回的是实体类型对象,load()返回的是动态代理类型对象.

  

    在使用时,需要注意以下事项:

      a.使用延迟加载的API后,避免过早的关闭Session.

LazyInitializationException: could not initialize proxy - no Session

      b.根据需要选择延迟加载和非延迟加载API

-----------------了解---------------------- 

   Hibernate延迟加载机制:利用动态生成代理类型机制生成一个动态代理类,并重写对象的getXXX()方法,当调用get方法时,触发SQL查询,去数据库加载数据.

   Hibernate动态生成代理类型机制:

   以前编写程序:

     a.编写一个类源码

     b.调用编译器将源码编译成class字节码

     c.类加载器将字节码文件载入虚拟机内容

     d.虚拟机调用字节码文件的方法,解释运行

   Session.load()等延迟方法返回的类型是Foo$Enhancer$CGLIB....,

这些类型是Hibernate框架利用程序在内容中动态生成并编译的类型.

上述功能,是Hibernate调用asm.jar,cglib-2.1.3.jar工具包完成的.

   asm.jar主要用于在内存中动态和编译生成一个类

   cglib.jar是基于asm.jar,对其扩展,在内存中生成一个代理类型.该代理类是原类型的一个子类.

  3)Hibernate中对象的状态

    在Hibernate使用中,对象的状态有以下三种

    a.临时对象 : 在程序中使用new方式创建的对象

    b.持久对象 : 在程序中与session对象关联,由session负责管理的对象.

                   处于session缓存中的对象都是持久对象

                   对象的持久性:指的是对象的数据状态在事务提交时可以与数据库保持同步更新.

             session.flush();//将持久对象与数据库同步

             tx.commit();//事务提交,提交前默认也调用session.flush()

    c.托管对象 : 在程序中如果session.close()后,session负责管理的持久对象将成为托管对象.垃圾回收器负责回收临时和托管状态,持久状态不能回收.

java基础知识总结(185)

热点推荐

登录注册
触屏版电脑版网站地图