天天看点

理解Hibernate框架

一、hibernate的工作原理

理解Hibernate框架

上面的执行过程图已经很清晰的阐释了hibernate的运行过程:首先,应用程序先调用Configration类,该类读取hibernate的配置文件及映射文件中的信息(如果我们使用注解的话则不需要读取映射文件),并使用这些信息生成一个SessionFactory对象。接着,从SessionFacctory生成一个Session对象,并用Session对象生成Transaction对象。通过Session对象的get()、sava()、update()、delete()和saveOrupdate()等方法对PO进行加载,保存,更新,删除等操作;在查询的情况下,可通过Session对象生成一个Query对象,然后利用Query对象执行查询操作。如果没有异常,Transaction对象将提交这些操作结果到数据库中,否则会回滚事务。

hibernate.cfg.xml配置文件:

  1. <span style="font-size:14px;"><!DOCTYPE hibernate-configuration PUBLIC    
  2.     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"    
  3.     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">    
  4. <hibernate-configuration>    
  5.     <session-factory>    
  6.         <!-- 设置数据库驱动 -->    
  7.         <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>    
  8.         <!-- 设置数据库URL -->    
  9.         <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_first</property>    
  10.         <!-- 数据库用户名 -->    
  11.         <property name="hibernate.connection.username">root</property>    
  12.         <!-- 数据库密码 -->    
  13.         <property name="hibernate.connection.password">123456</property>    
  14.         <!-- 指定对应数据库的方言,hibernate为了更好适配各种关系数据库,针对每种数据库都指定了一个方言dialect -->    
  15.         <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>    
  16.     <!-- 打印sql语句,方便调试 -->  
  17.         <property name="show_sql">true</property>  
  18.     <!-- 格式化sql语句,排版 -->  
  19.     <property name="foramt_sql">true</property>  
  20.     <!-- 指定hibernate生成数据库表的方式:create每次创建新表,update使用原表 -->  
  21.     <property name="hbm2ddl.auto">update</property>  
  22.     <!-- 使用session.getCurrentSession时需要打开该配置 -->  
  23.     <property name="hibernate.current_session_context_class">true</property>  
  24.         <!-- 映射文件 -->    
  25.         <mapping resource="com/pechen/hibernate/User.hbm.xml"/>    
  26.     </session-factory>    
  27. </hibernate-configuration>  </span>  

*.hbm.xml映射文件: [java]  view plain  copy

  1. <span style="font-size:14px;"><?xml version="1.0"?>    
  2. <!DOCTYPE hibernate-mapping PUBLIC     
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">    
  5. <hibernate-mapping>    
  6.     <!--生成默认为user的数据库表-->    
  7.     <class name="com.pechen.hibernate.User">    
  8.         <id name="id">    
  9.             <!-- 算法的核心思想是结合机器的网卡、当地时间、一个随机数来生成GUID -->    
  10.             <generator class="uuid"></generator>    
  11.         </id>    
  12.         <property name="name"></property>    
  13.         <property name="password"></property>    
  14.         <property name="createTime" type="date"></property>    
  15.         <property name="expireTime" type="date"></property>    
  16.     </class>    
  17. </hibernate-mapping></span>  

hibernate概述

   1、好处

        (1)封装简化数据库代码

        (2)简化DAO层的编码工作

        (3)性能好,灵活,支持各种关系数据库

   2、工作流程

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

         加载hibernate.cfg.xml

        (2)SessionFactory sessionFactory = configuration.buildSessionFactory()

                读取配置文件参数(JDBC连接、数据库方言、hbm加载)

        (3)Session session = sessionFactory.getSession()

                从连接池中获取一个连接,并创建session对象

        (4)Transaction transaction = session.beginTransaction()

                开启事务

        (5)数据操作

        (6)transaction.commit()

提交事务

(7)close.session()

关闭会话

(8)sessionFactory.close()

关闭连接池

   3、hibernate对象的三种状态

理解Hibernate框架
(1)瞬时态(transient)

               通过new创建对象,与数据库没有关联,调用save()、saveOrUpdate()、persist()、get()、load()变为持久态

(2)持久态(persistent)

与session关联,有数据库标识,调用delete()变为瞬时态,调用evict()、close()、clear()变为游离态

(3)游离态(detached)

                脱离session管理,无法保证与数据库的一致性,调用update()、saveOrUpdate()、merge()、lock()变为持久态,调 用delete()变为瞬时态

   4、五个核心接口

        (1)Configuration

配置hibernate,创建sessionFactory对象

(2)SessionFactory

初始化hibernate,创建session对象,线程安全的,重量级,二级缓存

(3)Session

数据库操作,县城不安全的,轻量级,一级缓存

(4)Transaction

管理事务

(5)Query和Criteria

执行数据库查询

   5、三种检索策略

(1)立即检索

将被检索的对象及其关联对象加载,如get()

优点:频繁使用的关联对象能被加载到缓存

缺点:占内存,select语句太多

(2)延迟检索

第一次使用关联对象时才加载,如load()

优点:select语句减少,提高性能,节省内存空间

缺点:session关闭后,无法访问关联类对象

(3)左外连接检索

优点:select语句减少,方便应用程序寻找关联对象

缺点:复杂的数据关系导致性能下降,可能会加载不需要的对象占用内存

   6、三种查询方式

native sql、hql、criteria

二、常用方法区别总结

   1、save()、saveOrUpdate()、persist()

        save() 更新

        saveOrUpdate() 有主键就更新,没主键就插入

persist() 不保证插入,有可能推迟到flush()

   2、insert()、merge()

insert() 插入

merge() 如果设置了数据库中没有的ID,执行insert(),如果设置了数据库中有的ID,执行update()

三、hibernate缓存机制

   1、一级缓存

session级别,默认开启,当session关闭时,自动释放一级缓存

   2、二级缓存

sessionFactory级别,默认不开启

四、hibernate并发机制

   1、什么是并发

当数据没有锁定且多个用户的事务同时对一个数据库进行操作,有可能发生数据的不一致,或其他一些问题

   2、可能带来的问题

(1)第一类丢失更新

前者的事务执行更新,而后者的事务由于执行失败引起事务回滚,造成前者的执行结果同时丢失

(2)脏读

后者的事务查询到前者事务提交前的数据

(3)虚读

在同一事务执行两次查询的过程中,有另一事务对数据进行了增删,造成了查询结果不一致

(4)不可重复读

在同一事务执行两次查询的过程中,有另一事务对数据进行了更新,造成了查询结果不一致

(5)第二类丢失更新

两事务同时进行写操作,后者事务的执行结果覆盖了前者事务的执行结果

   3、四种事务隔离级别

理解Hibernate框架

(1)串行化(Serializable)

(2)可重复读(Repeatable)

(3)可读已提交(Read Committed)

常用

(4)可读未提交(Read Uncommitted)

   4、乐观锁和悲观锁

(1)乐观锁

为数据库表添加版本号或时间戳,以此识别是否为过期数据

(2)悲观锁

为数据加锁,只有在事务提交时才会释放锁,使数据持久化

五、其他问题

    1、异常分析

        (1)在tomcat 启动时报错

                Disabling contextual LOB creation as createClob() method threw error:java.lang.reflect.Invocation

                这是由于hibernate默认用jdbc连接数据库,如果配置了连接池,需要修改相关配置。

                以整合后的ssh为例,你只需要在applicationContext.xml中配置hibernate属性的时候,加入

                <prop key="hibernate.temp.use_jdbc_metadata_defaults">false</prop>