构建单态模式的SessionFactory

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

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

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

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

一种是用静态代码块。

我用的方法是第二种。

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

代码如下:

package org.test.demo;

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 org.test.demo;


import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.test.entity.User;

public class UserTest {

  //定义变量

    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.操作

     User user=new User();

     user.setUname("zhangsan");

     user.setAge(20);

     user.setSex("男");

     user.setCity("上海");

     session.save(user);

     //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.操作
   //先查询

   User user=(User)session.get(User.class,3);

   //再删除
if(user!=null)
{
   session.delete(user);
 }
   //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.操作
User user=(User)session.get(User.class, 2);

   System.out.println(user);   
 //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.操作
User user=(User)session.get(User.class, 3);
 //修改地址为beijing

 user.setCity("哈尔滨");

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

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

 transaction.commit();

 //7.关闭资源

 session.close();

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

}


通过单元测试:

insert()测试:

select()测试:


delete()测试:


update()测试:


执行成功!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值