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()方法 //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()方法 //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()方法 //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()测试:
执行成功!