Hibernate2:构建单例模式的SessionFactory

1.概述:

应用程序从SessionFactory(会话工厂)里获得Session(会话)实例。它在多个应用线程间进行共享。

SessionFactory是线程安全的(Thread-Safe),可以让多个执行线程同时存取SessionFactory而不会有数据共享的问题。

会话工厂缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据。

 需要注意的是SessionFactory是重量级的,因为一 般情况下,一个项目通常只需要一个SessionFactory就够(单例模式),当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。

调用代码:

SessionFactory sessionFactory = cfg.buildSessionFactory();

2.概述:

Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流)

Session也称为持久化管理器,因为它是与持久化有关的操作接口。
Session不是线程安全的,应该避免多个线程共享同一个Session实例。
Session通过SessionFactory打开,在所有的工作完成后,需要关闭。
保证在一个线程中仅存在一个Session实例
getCurrentSession (Hibernate 3)
可以采用ThreadLocal的办法. (Hibernate 2)
把Session对象放在方法内部定义.

它与Web层的HttpSession没有任何关系。

3.那么,如何构建单态模式下的SessionFactory?

一种是私有构造方法,提供公共接口。

一种是用静态代码块。

我用的方法是第二种。

所以在项目中,要抽取出一个HibernateUntils工具类,用来提供Session对象。

配置文件等信息请见上次文章代码如下:

package com.utils;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {

    //声明一个私有的静态final类型的Configuration对象
    private static final Configuration config;
    //声明一个私有的静态final类型的SessionFactory对象
    private static final SessionFactory factory;
    //通过静态代码块构建SessionFactory
    static {    	   
			config=new Configuration().configure();
		    factory=config.buildSessionFactory();
    }
    //提供一个共有的静态方法供外部获取,并返回一个session对象
    public static Session getSession(){
 	   return factory.openSession();
    }
	     
}
在上述代码中,首先声明了一个私有的静态final类型的Configuration对象和SessionFactory对象,来供类中的其他成员使用,接下来通过静态方法构建SessionFactory实例,最后提供了一个公有的静态方法供外部获取Session对象。通过此工具类,在项目中就可以直接通过HibernateUtils.getSession()的方式获取Session对象。

在测试类中直接引用工具类中的方法:

package com.entity;


import org.hibernate.HibernateException;
import org.hibernate.Session;  
import org.hibernate.SessionFactory;  
import org.hibernate.Transaction;  
import org.hibernate.cfg.Configuration;  
import org.junit.Test; 
import org.hibernate.SessionFactory;

import com.utils.HibernateUtils;

public class TestDemo1 {
	//定义变量

    Configuration config=null;

    SessionFactory sessionFactory=null;

    Session session=null;

    Transaction transaction=null;
    @Test
    public void insert()
    {    
    	 try {
              //直接引用HibernateUtilS工具类中的getSession()方法
    		 session=HibernateUtils.getSession();

			//4.开始事务

			transaction=session.beginTransaction();
     //5.操作

     Customer cus=new Customer();
     cus.setUsername("小良");
     cus.setAge(20);
     cus.setSex("男");
     cus.setCity("哈尔滨");

     session.save(cus);

     //6.提交事务

     transaction.commit();

     //7.关闭资源

     session.close();

		} catch (HibernateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

    }

    //删除操作
    
    @Test
         public void delete()
         {

    	 try {
    		
        //直接引用HibernateUtilS工具类中的getSession()方法

        session=HibernateUtils.getSession();

       //4.开始事务

       transaction=session.beginTransaction();
     //5.操作
    		    //先查询
      
       Customer cus=(Customer)session.get(Customer.class,3);

    		    //再删除
    		 if(cus!=null)
    		 {
    		    session.delete(cus);
    		  }
       //6.提交事务

    		 transaction.commit();

    		 //7.关闭资源

    		 session.close();
    		
    	} catch (HibernateException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	}
  }
    
  //查询操作  
    @Test
        public void select()
        {
    	 try {

                //直接引用HibernateUtilS工具类中的getSession()方法

    		   session=HibernateUtils.getSession();

    		   //4.开始事务

    		   transaction=session.beginTransaction();
    		 //5.操作
    			
    			 Customer cus=(Customer)session.get(Customer.class,2);
    		    System.out.println(cus);   
    		  //6.提交事务

    		    transaction.commit();


    		    //7.关闭资源

    		    session.close();

    		   
    	} catch (HibernateException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	}
    }
    //更新操作
    @Test
        public void update()

        {    
    	 try {
    		
        //直接引用HibernateUtilS工具类中的getSession()方法

    		     session=HibernateUtils.getSession();

    		   //4.开始事务

    		   transaction=session.beginTransaction();
    		 //5.操作
    		   Customer cus=(Customer)session.get(Customer.class,1);
    		  //修改地址为beijing

    		  cus.setCity("青岛");

    		  //存在就更新,不存在就执行插入操作

    		  session.saveOrUpdate(cus);
    		  //6.提交事务

    		  transaction.commit();

    		  //7.关闭资源

    		  session.close();
    	
    	} catch (HibernateException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	}
        }

    

}

通过单元测试:

insert()测试:

  数据库中成功添加username=“小良”的一组数据

select()测试:

   成功搜索到数据

update()测试:

  成功将username="肖嘉良"的city信息将哈尔滨更新成青岛

 

delete()测试:

  成功删除数据

执行成功

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值