SessionFactory的单例模式

哈理工 软件15-3 1514010332

在Hibernate中,SessionFactory是重量级的,所以一个项目通常只需要一个SessionFactory就够(单例模式)。只有应应用中存在多个数据源时,才为每个数据源建立一个SessionFactory实例。因此在实际项目使用中,通常会抽取出一个HibernateUtils的攻击类,用来提供Session对象。下面就简单介绍一个简单的抽取方式。

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.getCurrentSession();
}

}

其中获取Session实例有两种方法,一种是通过openSession()方法,另一种是通过getCurrentSession()方法。

区别:采用openSession方法获取Session实例时,SessionFactory直接创建一个新的Session对象,并且在使用完成后需要调用close方法进行手动关闭。getCurrentSession方法创建的Session实例会被绑定到当前线程中,它在提交或回滚操作时会自动关闭。

通过此工具类,在项目中可以直接通过HibernateUtils.getSession()的方法获取Session对象。

增:

@Test
public void insertTest() {
Session session=HibernateUtils.getSession();
Transaction t=session.beginTransaction();
User user=new User();
user.setUsername("小li");
user.setPassword("123");
user.setAge(22);
session.save(user);
t.commit();
session.close();

}

改:

@Test
public void updateTest() {
Session session=HibernateUtils.getSession();
Transaction t=session.beginTransaction();
User user=new User();
user.setId(2);
user.setUsername("小y");
user.setPassword("123");
user.setAge(22);
session.update(user);
t.commit();
session.close();

}

删:

@Test
public void deleteByIdTest() {
Session session=HibernateUtils.getSession();
Transaction t=session.beginTransaction();
User user=(User)session.get(User.class, 1);
session.delete(user);
t.commit();
session.close();
}

查:

@Test
public void findByIdTest() {
Session session=HibernateUtils.getSession();
Transaction t=session.beginTransaction();
User user=(User)session.get(User.class, 2);
System.out.println("姓名:"+user.getUsername());
System.out.println("年龄:"+user.getAge());
System.out.println("性别:"+user.getPassword());
t.commit();
session.close();
}


你可能感兴趣的:(SessionFactory的单例模式)