• hibernate核心及常用技术


    一、hibernate介绍

    1、hibernate概述

      hibernate是轻量级Java EE持久层解决方案,管理java类到数据库表的映射(ORM:对象关系型数据映射),并提供数据查询获取的方法。

    2、体系结构

      

      (1)SessionFactory:这是Hibernate的关键对象,它是单个数据库映射关系经过编译后的内存镜像,它也是线程安全的。它是生成Session的工厂,本身要应用到ConnectionProvider,该对象可以在进程和集群的级别上,为那些事务之间可以重用的数据提供可选的二级缓存。

          (2)Session:它是应用程序和持久存储层之间交互操作的一个单线程对象。它也是Hibernate持久化操作的关键对象,所有的持久化对象必须在Session的管理下才能够进行持久化操作。此对象的生存周期很短,其隐藏了JDBC连接,也是Transaction 的工厂。Session对象有一个一级缓存,现实执行Flush之前,所有的持久化操作的数据都在缓存中Session对象处。

          (3)持久化对象:系统创建的POJO实例一旦与特定Session关联,并对应数据表的指定记录,那该对象就处于持久化状态,这一系列的对象都被称为持久化对象。程序中对持久化对象的修改,都将自动转换为持久层的修改。持久化对象完全可以是普通的Java Beans/POJO,唯一的特殊性是它们正与Session关联着。

          (4)瞬态对象和脱管对象:系统进行new关键字进行创建的Java 实例,没有Session 相关联,此时处于瞬态。瞬态实例可能是在被应用程序实例化后,尚未进行持久化的对象。如果一个曾今持久化过的实例,但因为Session的关闭而转换为脱管状态。

          (5)事务(Transaction):代表一次原子操作,它具有数据库事务的概念。但它通过抽象,将应用程序从底层的具体的JDBC、JTA和CORBA事务中隔离开。在某些情况下,一个Session 之内可能包含多个Transaction对象。虽然事务操作是可选的,但是所有的持久化操作都应该在事务管理下进行,即使是只读操作。

          (6)连接提供者(ConnectionProvider):它是生成JDBC的连接的工厂,同时具备连接池的作用。他通过抽象将底层的DataSource和DriverManager隔离开。这个对象无需应用程序直接访问,仅在应用程序需要扩展时使用。

          (7)事务工厂(TransactionFactory):他是生成Transaction对象实例的工厂。该对象也无需应用程序的直接访问。

    Hibernate的核心:

                     

         从上图中,我们可以看出Hibernate六大核心接口,两个主要配置文件,以及他们直接的关系。Hibernate的所有内容都在这了。那我们从上到下简单的认识一下,每个接口进行一句话总结。

      1、Configuration接口:负责配置并启动Hibernate

      2、SessionFactory接口:负责初始化Hibernate

      3、Session接口:负责持久化对象的CRUD操作

      4、Transaction接口:负责事务

      5、Query接口和Criteria接口:负责执行各种数据库查询

      注意:Configuration实例是一个启动期间的对象,一旦SessionFactory创建完成它就被丢弃了。

    3、hibernate映射

    4、组件属性映射

    5、hibernate关联映射

      hibernate双向ManyToMany映射

    7、HQL查询

      hibernate之HQL查询

    8、条件查询

      hibernate之条件查询

    9、SQL查询

      hibernate之SQL查询

    10、事务管理

      springmvc+hibernate4事务管理配置

    11、缓存机制

      缓存的目的减少代码与数据库的交互,从而提高数据库的访问性能。hibernate默认总是启用的session级别的一级缓存(每个session独有的,当Session 关闭后这个 CACHE 也就没有了),不需要开发者关心,总是有效的。sessionFactory的二级缓存是全局性的,被应用的所有session共享,默认情况是关闭的,需由程序显式开启。一旦应用中开启二级缓存,session在抓取数据时将先查找一级缓存,再查找二级缓存,只有在二者中都没有要抓取的数据时,才会查找底层数据库。

      缓存的 key 是根据 hql 生成的 sql ,再加上参数,分页等信息

      缓存介绍

    1、持久化对象的状态

      瞬态、持久化、脱管

    二、问题

    1、sessionFactory注入失败

    报错信息:No qualifying bean of type 'org.hibernate.SessionFactory' available

    解决:在web.xml中添加

    <listener>
        <listener-class>
          org.springframework.web.context.ContextLoaderListener
        </listener-class>
      </listener>

    2、sessionFactory.getCurrentSession()时无法获得同步事务

    报错信息:[Request processing failed; nested exception is org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread]

    解决:在web.xml中添加

      <filter>
        <filter-name>SpringOpenSessionInViewFilter</filter-name>
        <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
      </filter>
      <filter-mapping>
        <filter-name>SpringOpenSessionInViewFilter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>

    SpringMVC4+Hibernate4运行报错Could not obtain transaction-synchronized Session for current thread

    【SSH进阶之路】Hibernate基本原理(一)

  • 相关阅读:
    “5W1H”带你来学习JavaScript
    [windows+cocos2dx]文本类
    server后台TCP连接存活问题
    (七):处理MFC
    Servlet中的request对象、重定向和转发的差别(6)
    ORACLE 存储函数
    【@伏草惟存@】7年系列博文精选
    笔记14:Docker 部署Python项目
    笔记13:Python 和 Elasticsearch 构建简易搜索
    笔试12:Bootstrap知识
  • 原文地址:https://www.cnblogs.com/sunjf/p/hibernate_study.html
Copyright © 2020-2023  润新知