zoukankan      html  css  js  c++  java
  • Hibernate框架

    Hibernate是一个基于元数据轻量级ORM框架

    • 元数据(Meta Data):Data about data (关于数据的数据)描述数据(数据库)以及环境相关的数据(关联数据)。
    • 轻量级:占用的资源不是很多,没有侵入性。
    • ORMObject – Relation Mapping

     Java中对象和数据库的相关内容进行关系映射。类和表,对象和表中的数据,属性和字段。操作数据库采用面向对象的方式完成。

    对象模型

    关系模型

    面向对象分析设计(UML)

    数据库设计(PD)

    (关系)

    (关系)

    属性

    字段

    Java类型

    SQL类型

    对象(主键属性OID)

    记录(PK)

    • POJO(Plain Ordinary Java Object) 无格式的普通java对象,java对象中没有包含任何的逻辑代码,从数据层面上来看,POJO对象可以看做数据库中的实体化(对象化)表现方式。也称为实体类(Entity Class)

     也称为域模型对象(domain

    实体域模型对象(UserPOJO

    过程域模型对象(DAO,BO

    l 事件域模型对象(事件,异常)

    • VO(Value Object) 描述数据的对象。(Page 分页类)  
    • 持久化:

     狭义:将内存对象永久保存到数据库过程

     广义:就是指对数据的CRUD

    l Hibernate框架应用环境搭建

    • 拷贝常用jar
    • 创建hibernate.cfg.xml配置文件

     连接数据库信息

     方言

     管理映射文件

     其他(属性配置等)

    l Hibernate框架的核心API

    • SessionFactory
    • Session
    • Transaction
    • Query
    • Criteria
    • Configuration

    l Hibernate框架的主键生成策略

    • 表示如何生成表的主键
    • 主键的类型

    代理主键(推荐)

    提供一个和业务无关并且能够唯一标识一条记录的字段作为主键(一般是自增的,整型)

    自然主键

    l 提供一个与业务相关的主键

    • 主键生成策略有3种方式

    由数据库来生成主键(代理主键)

    l native :表示由方言决定采用什么数据库的主键生成方式。

    如果是mysql方言,那么就会采用自增长方式

    如果是Oracle方言,那么就会采用序列方式

    l sequence :表示采用数据库的序列方式生成主键,可以应用在OracleDB2数据库中

    l identity :表示采用自增长的主键生成方式,可以应用MySQLSQL Server 数据库

    Hibernate框架来生成主键(代理主键)

    l uuid :表示由框架根据参数(IP地址,JVM启动时间,系统时间,计算器)生成3216进制的数字字符串。推荐使用。主键属性必须是字符串类型。

    n 表示数据量大,添加数据效率高,查询效率低,通用移植性好

    l increment:表示由框架本身提供的计数器的方式自动增长。

    由用户来生成主键(自然主键)

    l assigned :表示主键由用户自己维护。

    Hibernate框架的对象三种状态

    • 瞬时状态(Transient Object ) 临时状态

    u 数据库中没有与之对应的数据

    u 对象与框架没有关联

    • 持久化状态(Persistent Object)

    u 数据中一般是存在与之对应的数据

    u 对象与框架一定关联

    • 游离状态(Detached Object) 离线状态,托管状态

    u 数据库中一定有与之对应的数据

    u 对象与框架没有关联,或连接断开。

    Hibernate框架中保存操作

    • 瞬时状态的对象可以保存
    • 持久化状态的对象不能保存

    持久化状态的含义就是对象和数据库中的一条数据对应,那么再保存就会有冲突了,所以不能保存。

    • 游离状态的对象不应该保存

    主键生成策略不是自己维护的情况下,可以保存成功。

    Hibernate框架中的更新操作(主键更新)

    • 瞬时状态的对象不能更新
    • 持久化状态的对象不能更新

    不需要显示调用update方法进行更新。持久化对象属性值变化会自动更新

    • 游离状态的对象可以更新

    Hibernate框架中的删除操作(主键删除)

    • 瞬时状态的对象不能删除
    • 持久化状态的对象可以删除
    • 游离状态的对象可以删除

    删除时框架会先查询(select)数据库中是否存在,如果存在则可以删除。

    Hibernate的主键查询

    • Get

    u 返回结果:持久化对象或null(非空判断)

    u 不支持延迟加载

    u 支持缓存

    • Load

    u 返回结果:持久化对象或异常或代理对象

    u 默认支持延迟加载

    禁用延迟加载,可以设置<class lazy=”false”/>

    u 支持缓存

    Hibernate面向对象查询

    • HQL

    其实就是对SQL的封装

    u Query接口

    u list()方法

    l 支持缓存,但自己不利用缓存

    l 如果希望利用缓存,可以配置查询缓存

    u iterate()方法 (N+1条语句)

    l 支持缓存,并且利用缓存

    l 使用一般和带缓存的方法一起用

    批量操作DML(insert,update,delete)

    l  不支持缓存操作

    • QBC

    u 动态参数查询

    l Hibernate框架的映射关系

    • 基本的映射关系

    多对一 (学生和班级)

    l <many-to-one>

    l 级联关系

    级联不能使用deleteall

    l 延迟加载

    l 抓取策略

    抓取策略是join的话,那么延迟加载不起作用。

    一对多(班级和学生)

    l 级联关系

    l 延迟加载

    l 抓取策略

    反转操作(inverse=”true”)

    多对多(学生和课程)

    级联不应该使用deleteall

    l 在任意其中一端设置反转操作

    中间表示的两个外键不要为null,表示联合主键

    u 自关联

    l 是双向的一对多和多对一的特殊情况

    使用一张表来描述数据的关系,外键字段可以为null

    l MyEclipse-Tools

    • 由类到表
    • 由表到类(可以提高开发效率)

    l Hibernate框架的延迟加载

    • 应用原因
    • 应用场合
    • 应用标签
    • 使用约束
    • 使用有效期

    l 解决延迟加载的方案

    • 保证Session在视图层是打开状态(OpenSessionInView模式)
    • ThreadLocal + Filter

    l Hibernate框架的缓存

    • 一级缓存(session缓存)

    u 默认支持

    • 二级缓存(SessionFactroy缓存)

    u 默认不支持

    u Ehcache

    • 查询缓存(HQL,Query)

    u 不推荐使用,查询命中率不是很高。

    l Hibernate框架解决数据冲突问题

    • 悲观锁

    行级锁 select .. for update

    u 类似线程同步,性能低

    • 乐观锁(推荐)

    u 时间戳

    版本号(Hibernate)

    l Hibernate框架的注解

    • 注解和配置文件的比较
    • JPA
    • Hibernate框架应用开发时常用的注解

    l Hibernate框架的POJO类设计规则

    • 一定要存在默认的构造方法
    • 构造方法可以是private的,但是对于cglib代理的应用,修饰符至少protected
    • 尽量不要使用final修饰
    • 尽量实现可序列化接口
    • 属性的get/set方法是需要提供的,如果不提交的话,需要设置标签的access="field"

    l Hibernate框架的总结

    • 优点

    轻量级的ORM框架

    u 提供延迟加载功能,缓存机制

    u 透明持久化,操作对象就等同操作数据库,隐藏了持久化的过程,使操作起来更加容易

    • 缺点

    u 由于面向对象的操作方式,进行大数据量操作时性能比较低

    执行效率比 jdbc,ibatis

    u 影响表的设计原则

    l Hibernate框架的竞争

    • JPA(规范)
    • Oracle TopLink
    • SUN JDO
    • Apache OJB

    框架的优化

    • Struts2

    u 去掉使用不到的拦截器

    过滤器的过滤规则尽量不要使用/*

    关闭开发模式(devMode)

    • Hibernate

    u 尽量使用延迟加载

    u 使用缓存(只读)

    u 尽量使用乐观锁代替悲观锁

    尽量使用框架的最新版本,一般会有性能方面的支持

    推荐使用uuid主键生成策略,移植性好,支持大数据量

  • 相关阅读:
    [Docker]一键部署gitlab中文版
    [Docker]python 2.7.5 docker-compose安装
    [CentOS7]pip安装
    快速傅里叶变换FFT
    HDU 4734 f(x)
    DP
    HDU 3555 Bomb
    HDU 5898 odd-even number
    将文本拷贝到剪贴板
    数论分块
  • 原文地址:https://www.cnblogs.com/hkdpp/p/10495877.html
Copyright © 2011-2022 走看看