Home Hibernate概述
Post
Cancel

Hibernate概述

知识点

  • Hibernate概述
    数据持久化、ORM概念及原理、Hibernate编程步骤
  • Hibernate基础
    实体映射、ID生成器、Hibernate数据类型,Hibernate对象生命周期
  • 关联映射
    一对一、一对多、多对多
  • 高级映射
    组合映射、继承映射、值集合映射
  • 事务管理
    事务传播性、事务隔离级别、事务控制
  • 高级查询
    Criteria、HQL

一、对象持久化

1、持久(Persistence)

  • 数据保存到可掉电设备中。
  • 企业级应用中,即把内存中(瞬时)的数据保存到磁盘中加以“固化”。

2、对象持久化技术

  • Java对象序列化和反序列化:数据查询困难,效率低
  • 通过XML保存对象:复杂的xml操作,用于应用或公司间进行数据传输
  • JDBC:关系型数据库(RDBMS),SQL(DDL, DML):低水平的数据操作
  • 对象关系映射(ORM)

二、JDBC的缺点

1、JDBC编程步骤

  1. 注册驱动
  2. 建立到数据库的连接
  3. 创建statement
  4. 执行SQL语句
  5. 处理ResultSet
  6. 关闭JDBC对象

缺点:重复的编程步骤

2、JDBC数据封装

JDBC数据封装过程

缺点:编程人员大部分精力花费在对ResultSet数据封装。

三、ORM

1、概念

Object Relational Mapping(对象关系映射),通过使用描述对象和数据库之间映射的元数据,将Java程序中的对象自动持久化到关系数据库中。

2、ORM包括四个部分

  • 一个对持久类对象进行CRUD操作的API
  • 一个语言或API用来规定与类和类属性相关的查询
  • 一个规定元数据映射的工具
  • 一种技术可以让ORM的实现同事务对象一起进行dirty checking, lazy association fetching以及其他的优化功能

3、为什么采用ORM模式

  • 提高生产率(Productivity)
  • 可维护性(Maintainability)
  • 更好的性能(Performance)
  • 厂商独立性(Vendor independence)

4、ORM主流框架

  • Hibernate:开源、性能、稳定性
  • TopLink:Oracle商业商业产品
  • Ibatis、MyBatis:开源、开放性
  • Apache OJB:开源、性能、稳定性、支持各种标准规范

四、Hibernate简介

Hibernate强大功能,按照Java基础语义(关联、继承、多态、组合及Java集合框架)的持久层开发,面对对象查询语言(HQL)。

1、Hibernate 环境配置

库文件包

  • antlr.jar — HQL转换工具
  • asm.jar, asm-attrs.jar — generate and transform classes
  • cglib.jar — 实现PO字节码的动态生成
  • dom4j.jar — 读写xml
  • hibernate3.jar — 核心包
  • jta.jar — JAVA 事务处理接口
  • commons-collections.jar — Apache Commons包中的一个,开发的集合类
  • commons-logging.jar — Apache Commons包中的一个,日志功能
  • ojdbc14.jar — oracle驱动包
  • c3p0.jar — 数据库连接池
  • ejb3-persistence.jar, hibernate-annotations.jar — 注解基础包
  • hibernate-entitymanager.jar — JPA支持包
  • javassit.jar — 代码生成包
  • jboss-archive-browsing.jar — support JPA entity manager

2、Hibernate应用组成

  • DDL(可选) — sql
  • POJO(plain object java obiect) — 持久化类
    • Id
    • 需映射属性的get/set方法
    • 空参构造方法
  • Hibernate配置文件 — hibernate.cfg.xml or hibernate.properties
  • 创建对象-关系映射 — .hbm.xml or 注解
  • 通过Hibernate API访问数据库的代码

3、Hibernate项目结构

4、Hibernate开发步骤—API应用步骤

  • 创建Hibernate配置,读取Hibernate配置文件及信息
  • 用读取的配置信息生成SessionFactory对象
  • 从SessionFactory对象获取一个Session对象
  • 用Session对象生成事务
  • 通过Session对象的方法进行操作
  • 提交或回滚事务
  • 释放session and session factory资源

5、Hibernate核心API

  • Session
    是数据连接与事务管理 间的中间接口,它是非线程安全的,所以一个线程只创建一个Session对象。
    save()/beginTrasaction()/close()/delete()/get()/load()/persist()/saveOrUpdate()/update()
  • SessionFactory
    负责创建Session对象, SessionFactory对象中保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句。可以通过Configuration对象创建SessionFactory对象。
    openSession()/close()
  • Configuration
    配置hibernate,启动hibernate 时读取cfg.xml ,创建SessionFactory对象。
    config()
  • Transaction
    数据库事务接口, 可选接口,将应用代码从底层的事务实现中抽象出来,可能会是:JDBC事务、JTA用户事务
    commit()/rollback()
  • Query
    查询接口,query实例包装了HQL查询语句。
    list()/setXXX()
  • Criteria
    查询接口,用于创建和执行条件查询,更面向对象。
    list()/add()/createCriteria()

6、Hibernate对象生命周期

对象生命周期:一个对象从被创建开始,到不再使用,被垃圾回收期回收为止。一个持久化类的实例可能处于三种不同状态中的某一种。 这三种状态的定义则与所谓的持久化上下文(persistence context)有关:

  • 瞬时状态 (Transient)
  • 持久状态(Persistent)
  • 脱管状态(Detached)

Hibernate的Session对象就是这个所谓的持久化上下文

  • 瞬时对象
    由new操作符创建,且尚未与Hibernate Session 关联的对象被认定为瞬时(Transient)的
    瞬时(Transient)对象不会被持久化到数据库中,也不会被赋予持久化标识(identifier)
    如果瞬时(Transient)对象在程序中没有被引用,它会被垃圾回收器(garbage collector)销毁
    使用Hibernate Session可以将其变为持久(Persistent)状态
  • 持久对象
    持久(Persistent)的实例在数据库中有对应的记录,并拥有一个持久化标识(identifier)
    Hibernate会检测到处于持久(Persistent)状态的对象的任何改动,在当前操作单元(unit of work)执行完毕时将对象数据(state)与数据库同步(synchronize)
    在默认情况下,Hibernate会在UPDATE中包含所有的列
    如果只更新那些被修改的列,可以通过修改配置dynamic-update="true"来实现
  • 脱管对象
    实例曾经与某个持久化上下文发生过关联,不过那个上下文被关闭了, 或者这个实例是被序列化(serialize)到另外的进程。 它拥有持久化标识,并且在数据库中存在一个对应的行
    脱管(Detached)对象不在持久化管理之内,但对脱管对象的引用依然有效,对象可继续被修改
    Detached状态的对象可以再次与某个Session实例相关联而成为Persistent对象

7、Hibernate对象状态转换

This post is licensed under CC BY 4.0 by the author.