码迷,mamicode.com
首页 > Web开发 > 详细

Hibernate核心类和接口

时间:2015-08-19 13:35:17      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:hibernate

一:hibernate的核心类和接口

1.Configuration 类

它的用处是:

a.      读取hibernate.cfg.xml

b.      管理对象关系映射文件 <mapping resource=””>

c.      加载hibernate 的驱动,url ,用户..

d.      管理hibernate配置信息


2.SessionFactory (会话工厂)

a.      可以缓存sql语句和数据(称为session级缓存)!!

b.      是一个重量级的类,因此我们需要保证一个数据库,有一个SessionFactroy


通过SessionFactory获取 Session的两个方法 openSession() 一个 getCurrentSession();

|.   openSession() 是获取一个新的session

||.  getCurrentSession () 获取和当前线程绑定的session,换言之,在同一个线程中,我们获取的session是同一session,这样可以利于事务控制 

     Session 

|||. 果需要在同一线程中,保证使用同一个Session则,使用getCurrentSession(),如果在一个线程中,需要使用不同的Session,则使用opentSession()

     通过 getCurrentSession() 获取的session在事务提交后,会自动关闭,通过openSession()获取的session则必须手动关闭.

     如果是通过getCurrentSession() 获取 sesssion ,进行查询需要事务提交


3.全局事务和本地事务

a. 如何确定你的session有没有及时关闭

    windows  cmd netstat –an      [oracle 1521mysql 3306 sql server 1433]

    linux/unix  netstat –anp top  

b. session接口

它的主要功能和作用是:

|.        Session一个实例代表与数据库的一次操作(当然一次操作可以是crud组合)

||.        Session实例通过SessionFactory获取,用完需要关闭。

|||.        Session是线程不同步的(不安全),因此要保证在同一线程中使用,可以用getCurrentSessiong()。

||||.        Session可以看做是持久化管理器,它是与持久化操作相关的接口

二:get和load

1.       如果查询不到数据,get 会返回 null,但是不会报错, load 如果查询不到数据,则报错ObjectNotFoundException

Users use=(Users)session.getload(Users.class, 8);

2.      使用get 去查询数据,(先到一级/二级)会立即向db发出查询请求(查询语句select ...), 如果你使用的是 load查询数据,(先到一级、二级))即使查询到对象,返回的是一个代理对象,如果后面没有使用查询结果,它不会真的向数据库发select ,当程序员使用(比如输出查询结果时候System.out.println();)查询结果的时候才真的发出select ,这个现象我们称为懒加载(lazy)

3.      通过修改配置文件,我们可以取消懒加载

<class  name="Employee"lazy="false" table="employee">

4.      如何选择使用哪个: 如果你确定DB中有这个对象就用load(),不确定就用get()(这样效率高)


三:一级和二级缓存

session缓存称为一级缓存,内存或者磁盘缓存称为二级缓存

技术分享

使用load进行查询时,现在session级缓存查询,如果没有,进行二级缓存查询,最后进入数据库查询,如果查询到,

则把结果保存在二级缓存中,下次查询相同的信息时,直接进入二级缓存进行查询


案例:该案例要结合hibernate第一篇博客来看,地址:http://blog.csdn.net/dzy21/article/details/47703315

Session session=MySessionFactory.getSessionFactory().openSession();

      try {   

         //修改用户,前提获取该用户

         Usersuse=(Users) session.load(Users.class, 2);

         System.out.println(use.getName());

         Usersuse2=(Users) session.load(Users.class, 2);

         System.out.println(use2.getEmail());

      }finally{

         //关闭session

         if(session!=null &&session.isOpen()){

            session.close();

         }

     }

技术分享

上面的查询结果可知,两次查询,只向数据库发送了一次请求,所以上面的结论正确


四:编写session的工具类

技术分享

package com.cloud.util;

import org.hibernate.SessionFactory;

import org.hibernate.cfg.Configuration;

import org.hibernate.classic.Session;

final public class HibernateUtil{

         privatestatic SessionFactory sessionFactory=null;

         //使用线程局部模式

         privatestatic ThreadLocal<Session> threadLocal=new ThreadLocal<Session>();

         //私有构造函数,不允许别人随便创建

         privateHibernateUtil(){};

         static{

                   sessionFactory=newConfiguration().configure().buildSessionFactory();

         }

         //获取全新的Session

         publicstatic Session openSession(){

                   returnsessionFactory.openSession();

         }

         //获取和线程关联的session

         publicstatic Session getCurrentSession(){

                   Sessionsession=threadLocal.get();

                   //判断是否获取到了

                   if(session==null){

                            //如果没有获取,就自行创建一个

                            session=sessionFactory.openSession();

                            //把session对象和线程绑定

                            threadLocal.set(session);

                   }

                   returnsession;

         }

}

 

 

package com.cloud.util;

import org.hibernate.SessionFactory;

import org.hibernate.cfg.Configuration;

//该类不能被继承

//使用hibernate开发项目时,保证一个数据库只有一个sessionFactory

final public class MySessionFactory{

         privatestatic SessionFactory sessionFactory=null;

         privateMySessionFactory(){        

         }

         static{

                   sessionFactory=newConfiguration().configure().buildSessionFactory();

         }

         publicstatic SessionFactory getSessionFactory(){

                   returnsessionFactory;

         }

}



版权声明:博主原创文章,转载请说明出处。http://blog.csdn.net/dzy21

Hibernate核心类和接口

标签:hibernate

原文地址:http://blog.csdn.net/dzy21/article/details/47774949

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!