Hibernate-ORM:09.Hibernate中的getCurrentSession()

------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------

本篇博客将讲述,以优雅的方式创建session对象,我将会说明优点,并提炼成工具类

优点:

  1.无需手动关闭session

  2.提高了性能,不需要频繁的创建session对象

说明:

  虽然getCurrentSession()底层调用了openSession(),但是做了单例操作,所以性能更高,更安全

工具类:

package cn.dawn.util;

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

/**
 * Created by Dawn on 2018/5/30.
 */
public class SessionFactoryUtil {
    private static Configuration configuration;//加载核心配置文件
    private static SessionFactory factory;//单例对象

    //在类加载的时候,加载静态代码块
    static {
        configuration=new Configuration().configure();//默认加载根目录下的hibernate.cfg.xml
        factory=configuration.buildSessionFactory();
    }

    //通过sessionfactory创建session
    /*设置同步,保证线程安全*/
    public static synchronized Session getCurrentSession(){
        return factory.getCurrentSession();
        /*不能直接使用,需要在核心配置文件中加入一个节点*/
        /*<property name="current_session_context_class">thread</property>*/
    }
}

另外需要在hibernate.hbm.xml中配置一个节点

<property name="current_session_context_class">thread</property>

简单的使用案例:

package cn.dawn.day03;

import cn.dawn.day03.entity.Teacher;
import cn.dawn.util.SessionFactoryUtil;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.util.List;

/**
 * Created by Dawn on 2018/5/25.
 */
/*分页*/
public class Test0120180530Page {
    /*事物*/
    Transaction tr=null;
    /*session*/
    Session session=null;




    @Test
    /**
     * 分页
     *
     * 01.查询总记录数
     * 02.每页显示的数据
     * 03.总页数
     */
    public void t1Page(){
        String hql="select count(*) from Teacher";//会返回Long类型
        int counts=((Long)session.createQuery(hql).uniqueResult()).intValue();
        /*页大小*/
        int pageSize=2;
        /*总页数*/
        int totalPages=(counts%pageSize==0)?(counts/pageSize):(counts/pageSize+1);
        /*显示第二页内容*/
        int pageIndex=2;
        hql="from Teacher";
        Query query = session.createQuery(hql);;
        /*从哪一条开始查*/
        query.setFirstResult((pageIndex-1)*pageSize);
        /*设置页大小*/
        query.setMaxResults(pageSize);
        List<Teacher> teachers = query.list();
        for (Teacher t:teachers) {
            System.out.println(t);
        }

    }


    /*在执行之前加载配置,运行事物*/
    @Before
    public void beforeTest(){

        /*使用工具类*/
        /*创建session*/
        session = SessionFactoryUtil.getCurrentSession();
        /*创建事物*/
        tr = session.beginTransaction();
    }

    /*在执行之后,提交事物,关闭session*/
    @After
    public void afterTest(){
        /*提交事物*/
        /*tr.commit();*/
        /*关闭session*/
        /*session.close();*/
    }
}
原文地址:https://www.cnblogs.com/DawnCHENXI/p/9121074.html