美文网首页
Hibernate 执行流程(核心API使用)

Hibernate 执行流程(核心API使用)

作者: 年少懵懂丶流年梦 | 来源:发表于2017-02-24 16:17 被阅读91次
    1. 配置对象Configuration
      作用:读取配置文档:Hibernate.cfg.xml;
    2. 创建SessionFactory对象
      作用:读取相应的里面加载的对象关系映射文件
    3. 创建session文件
      作用:类似于JDBC中的Connection,这个session对象等同于连接对象
      执行增删改查:save,delete,update,createQuery等。
    4. 执行某个session对象的方法的时候,必须开启一个事物transaction,这些方法需要封装在事物当中。
    5. 执行完成方法之后,需要提交事务并且关闭session
      transaction.commit();
      session.close();

    session与connection是多对一的关系,每个session都有一个与之对应的connection,一个connection不同时刻可以供多个session使用。

    Configuration类(管理Hibernate的配置信息)

    Configuration 类负责管理 Hibernate 的配置信息。包括如下内容:

    • 加载hibernate.properties 和 hibernate.cfg.xml
    • 持久化类与数据表的映射关系(*.hbm.xml文件)

    创建Configuration 的两种方式:

    • 属性文件(hibernate.properties):
      Configuration cfg = new Configuration(); //手动加载hbm

    • Xml文件(hibernate.cfg.xml)
      Configuration cfg = new Configuration().configure();

    在核心配置文件中引入映射配置文件:

    • 之前做法:
     <!-- 引入映射配置文件 -->
    <mapping resource="com/meng/entity/Users.hbm.xml" />
    
    • 还有另外方式加载映射配置文件(了解)

    SessionFactory接口(获取Session对象)

    Configuration对象根据当前的配置信息生成SessionFactory对象

    • SessionFactory对象中保存了当前数据库配置信息和所有映射关系以及预定义的SQL语句
    • SessionFactory对象是线程安全的
    • SessionFactory还负责维护Hibernate的二级缓存
    Configuration configuration = new Configuration().configure();
    

    创建sessionFactory

    SessionFactory sessionFactory = configuration.buildSessionFactory();
    

    可以通过SessionFactory对象 获得Session对象

    Session session = sessionFactory.openSession();
    或者
    Session session = sessionFactory.getCurrentSession();
    

    openSession与getCurrentSession的区别

    • openSession 每次使用都是创建一个新的session;getCurrentSession 是获取当前session对象,连续使用多次时,得到的session都是同一个对象。
    • getCurrentSession在事物提交或者回滚之后会自动关闭;而openSession需要手动关闭,如果使用openSession而没有手动关闭,多次使用之后会导致连接池溢出。
    • 一般在实际开发中,往往使用getCurrentSession多,因为一般是处理同一个事务,所以在一般情况下比较少使用openSession。

    构造SessionFactory 很消耗资源,一般情况下一个应用只初始化一个

    Session接口(CRUD操作)

    • 调用Session里面的方法,实现crud操作。
    • Session是单线程对象,只能有一个操作时候,不能同时多个操作使用,不要把Session变量定义成成员变量,每次使用都创建新对象,相当于JDBC的Connection。
    • Session是应用程序与数据库之间交互操作的一个单线程对象,是 Hibernate 运作的中心;Session是线程不安全的。
    • 所有持久化对象必须在Session 的管理下才可以进行持久化操作。
    • Session 对象有一个一级缓存,显式执行 flush 之前,所有的持久化操作的数据都缓存在 session 对象处。
    • 持久化类与 Session 关联起来后就具有了持久化的能力。

    常用方法

    Transaction接口(事务)

    代表数据库操作的事务对象

    • hibernate对数据库的操作都是封装在事物transaction当中,并且默认是非自动提交的方式,所以用session保存对象时,若不开启事务,并手工提交事务,对象时不会保存到数据库当中的。
    • 如果你想让Hibernate向jdbc那样自动提交事务,可以不开启事物,用session的doWork()方法,并设置自动提交事务,在保存对象之后,记得用session.flush();来输出SQL语句,不然对象也是不会保存到数据库中的。但一般是不建议用第二种方法,都是用事物来封装对数据库的操作。
            Session session = sessionFactory.getCurrentSession();
            // 写添加逻辑
            // 项数据库设置值
            Users user = new Users();
            user.setUsername("siru");
            user.setPassword("654123");
            session.doWork(new Work() {
                
                @Override
                public void execute(Connection connection) throws SQLException {
                    connection.setAutoCommit(true);
                }
            });
             session.save(user);
             session.flush();
      
    
    开启事务
    

    Transaction transaction = session.beginTransaction();

    提供事务管理的方法:
    - commit():  提交相关联的session实例
    - rollback():  撤销事务操作
    - wasCommitted():  检查事务是否提交

    相关文章

      网友评论

          本文标题:Hibernate 执行流程(核心API使用)

          本文链接:https://www.haomeiwen.com/subject/ffjhwttx.html