zoukankan      html  css  js  c++  java
  • hibernate(工具类、API、openSession()与getCurrentSession()的区别)

    1、hibernate的API

    (1)程序源码:

    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;
    import pers.zhb.domain.Student;
    class HinernateTest{
        public static void testAdd()  {
            //(1)加载hibernate核心配置文件
            //src目录下的配置文件名称是固定的:hibernate.cfg.xml
            Configuration configuration= new Configuration();
            configuration.configure();
            //(2)读取hibernate核心配置文件的内容,创建sessionFactory对象,根据映射关系创建相应的表
            SessionFactory sessionFactory=configuration.buildSessionFactory();
            //(3)利用sessionFactory对象创建session对象
            //类似于创建连接
            Session session=sessionFactory.openSession();
            //(4)开启事务
            Transaction transaction=session.beginTransaction();
            //(5)具体操作
            Student student=new Student();
            student.setSname("zzzz");
            student.setSex("男");
            student.setBirthday("2019-11-11");
            student.setClassno("201911");
            student.setPoint(111);
            student.setPhone("1873496511");
            student.setEmail("20171514@qq.com");
            session.save(student);
            //(6)提交事务
            transaction.commit();
            //(7)关闭资源
            session.close();
            sessionFactory.close();
        }
        public static  void main(String []args){
            HinernateTest hinernateTest=new HinernateTest();
            hinernateTest.testAdd();
        }
    }
    

    (2)configuration对象:

     Configuration configuration= new Configuration();
     configuration.configure();

    创建时调用空参构造方法,加载src目录下的hibernate.cfg.xml文件。

    (3)sessionFactory对象(用于创建操作数据库的session对象的工厂):

    SessionFactory sessionFactory=configuration.buildSessionFactory();

    根据配置信息,创建sessionFactory对象。

    特点:

    负责保存和使用所有配置信息,消耗的内存资源比较大。

    线程安全。

    根据sessionFactory对象的特点,应该尽量只创建一个sessionFactory对象。

    (4)session对象:

            Session session=sessionFactory.openSession();

    类似于JDBC中的创建连接。

    (5)transaction对象:

     Transaction transaction=session.beginTransaction();

    开启事务并获得操作事务的transaction对象。

    (6)提交事务:

    transaction.commit();

    (7)回滚事务:

    transaction.rollback();

    (8)释放资源:

    session.close();
    sessionFactory.close();

    2、工具类

    因为hibernate的代码大部分都是固定的,为了将减少重复的代码的书写,可以将这些代码封装为一个工具类,获取hibernate的session对象。

    (1)创建hibernate的工具类:

    package pers.zhb.HibernateUtils;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    public class HibernateUtils {
    public static SessionFactory sessionFactory;
    static {//只执行一次,确保sessionFactory只创建一次,加载类的时候为静态变量分配一次内存
        Configuration configuration = new Configuration().configure();
        sessionFactory = configuration.buildSessionFactory();
    }
    public static Session openSession(){//获得session
        Session session=sessionFactory.openSession();
        return session;
    }
    public static Session getCurrentSession(){//获得与线程绑定的Session
        Session session=sessionFactory.getCurrentSession();
        return session;
    }
    }

    (2)测试类(查询学号为937221509的学生信息):

    import org.hibernate.Session;
    import org.hibernate.Transaction;
    import pers.zhb.domain.Student;
    import pers.zhb.HibernateUtils.HibernateUtils;
    public class HiberateSel {
        public static void testSel() {
            Session session = HibernateUtils.openSession();
            Transaction transaction = session.beginTransaction();
            Student student=session.get(Student.class,937221509);
            System.out.println(student);
            transaction.commit();
            session.close();
        }
        public static  void main(String []args){
            HiberateSel hinernateSel=new HiberateSel();
            hinernateSel.testSel();
        }
    }

    3、openSession()与getCurrentSession()

    (1)getCurrentSession()创建的Session会和当前线程绑定,OpenSession()则不会。

    (2)getCurrentSession()创建的Session在commit或rollback后会自动关闭,openSession()必须手动关闭。

    (3)使用getCurrentSession()需要在Hibernate.cfg.xml配置文件中进行配置:
    一个数据库资源:

    <propety name=”Hibernate.current_session_context_class”>thread</propety>

    全局事物、jta事物、多个数据库资源或事物资源:

    <propety name=”Hibernate.current_session_context_class”>jta</propety>

    代码如下:

    HibernateUtils.getCurrentSession().beginTransaction();
         ... ...
    HibernateUtils.getCurrentSession().getTransaction().commit();

    当使用openSession()的时候不需要如上的配置,代码如下:

    Session session =  HibernateUtils.openSession();
    Transaction transaction= session.beginTransaction();
    transaction.commit();
  • 相关阅读:
    IntelliJ IDEA设置JVM运行参数
    IntelliJ IDEA 乱码解决方案 (项目代码、控制台等)
    188.索引与视图
    187.数据库操作
    186.元素
    185.流程设计
    184.数据操纵语言DML
    改变linux shell前景色和背景色
    Centos文本方式安装情况下lvm分区的创建
    深入理解计算机系统第二版习题解答CSAPP 2.20
  • 原文地址:https://www.cnblogs.com/zhai1997/p/11802658.html
Copyright © 2011-2022 走看看