zoukankan      html  css  js  c++  java
  • Hibernate5笔记3--详解Hibernate的API

    详解Hibernate的API:

      (1)Configuration接口:

        org.hibernate.cfg.Configuration接口的作用是加载主配置文件及映射文件,以实现对Hibernate的启动。Configuration实例调用buildSessionFactory方法便可创建一个Session工厂SessionFactory对象。

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

        new Configuration()会加载一个属性文件hibernate.properties。该属性文件中存放着数据连接配置、Hibernate配置等配置信息。一般情况下不用设置该属性文件,其设置已经放到了主配置文件中。若要设置,应将其放于src目录下。该文件的模板存放于Hibernate框架解压目录下的project/etc下。

        configure()方法,用于加载和解析hibernate.cfg.xml配置文件及映射文件。该方法返回一个Configuration对象。所以,cfg是一个包含配置信息及映射的Configuration对象

      (2)SessionFactory接口:

        org.hibernate. SessionFactory接口对象是由Configuration对象通过buildSessionFactory()方法创建创建该对象的目的是,用于开启Session对象

        SessionFactory sessionFactory = cfg.buildSessionFactory();

        SessionFactory的特点:重量级对象(系统开销大)、单例的、线程安全的。 按理说,单例对象一定是被共享的,是线程不安全的。但查看SessionFactory接口的实现类SessionFactoryImpl源码,可以看其大多数成员变量是final的,所以其是线程安全的。

        SessionFactory的使用原则:基于其是线程安全的重量级对象,其创建与销毁时系统开销大,又是单例的特点,SessionFactory对象一般不手工关闭,而是在应用结束时自动将其销毁。因此,SessionFactory不用进行close()关闭。

      (3)Session接口:

        org.hibernate.classic.Session接口是应用程序与Hibernate连接的核心API,是Hibernate向应用程序提供的操纵DB的最主要接口。它提供了基本的保存、更新、删除与查询方法由SessionFactory对象创建

        Session s= sessionFactory.openSession();

        Session的特点:轻量级对象、线程不安全的、多例的。 在Web应用中,多个用户对同一应用访问,Hibernate会为每个用户创建一个Session对象。所以是多例的。session中包含大量非final成员变量,对于同一个用户的操作,可能会产生多个事务,这多个事务若同时对同一个Session的同一个成员变量进行访问,就会引起并发问题。所以session是线程不安全的。

        Session的使用规则:Session在使用时要做到一个线程一个Session,即一个事务一个Session使用完毕,立即关闭。Session不要作为某个类的成员变量出现,因为这样会出现多个实例对象对同一个session的共享,使其更不安全。

        Session的正确获取方式:为了保证一个线程一个Session,即一个线程中使用的Session是同一个对象,一般在获取Session对象时,使用SessionFactory的getCurrentSession()方法。不过,使用该方法获取Session对象,需要在主配置文件中对Session所处的上下文环境,即事务环境进行注册。使用getCurrentSession()方法获取的Session,在进行事务提交或回滚后,会自动关闭,无需再手工进行close()。(getCurrentSession()是对openSession()的包装,包装在ThreadLocal方法中

        <!-- 当前Session上下文 -->
             <property name="hibernate.current_session_context_class">thread</property>

        其取值有三种:thread(表示当前Session所处的环境为本地事务环境,Session会与当前线程绑定)、jta(表示当前Session所处的环境为分布式事务环境)、SpringSessionContext类(SSH整合时使用)

        openSession和getCurrentSessiond的区别

        

        Session的常用方法:

          save()/persist() :添加对象     update() :修改对象     saveOrUpdate():添加或修改对象     delete():删除对象      get()/load():根据主键查询
          createQuery() / createSQLQuery():创建查询对象      createCriteria():条件查询,QBC,纯面向对象语句

      (4) Transaction接口:

        通过该接口,可以将事务从持久层,提升到业务层。由Session对象创建
        session.getTransaction();
        事务的开启:session.beginTransaction();  或  session.getTransaction().begin(); 

        事务的提交:session.getTransaction().commit(); 

        事务的回滚:session.getTransaction().rollback();

    持久对象状态管理:

      (1)Hibernate的对象状态:

        这里的状态是只对象处于什么存储介质中,用于存放对象的存储介质有三个:普通内存(与Hibernate无关)、Session缓存、数据库。对象处于不同的介质中,就将处于不同的状态。

        (1)瞬时态(transient态):在内存,不在Session,不在数据库

        (2)持久态(persistent态):在内存,在Session,在数据库

        (3)游离态(detached态):在内存,不在Session,在数据库

        (4)无名态:不在内存,不在Session,在数据库

      (2) 状态转换图:

         

        上图中部分方法的介绍:evict():将指定对象仅仅从session中删除,但不删除数据库中的该数据;close():关闭Session对象;clear():清空Session的缓存

  • 相关阅读:
    Maven打包时去掉项目版本号
    maven编译的时候排除junit测试类
    Redis与Zookeeper实现分布式锁的区别
    分布式锁(基于redis和zookeeper)详解
    解读阿里巴巴集团的“大中台、小前台”组织战略
    java高并发系列
    JAVA之Unsafe学习笔记
    测试用例之正交排列法
    测试用例之因果图/判定表
    测试用例之边界值法
  • 原文地址:https://www.cnblogs.com/qjjazry/p/6285675.html
Copyright © 2011-2022 走看看