Hibernate 基础学习
Hibernate 是一个是一个对象/关系映射的解决方案,简单地说就是将Java中对象与对象之间的关系映射至关系数据库中的表与表之间的关系。
1.1 概述:
1.1.1、ORM简介:
对象/关系映射ORM(Object-Relation Mapping) 是用于将对象与对象之间的关系映射至数据库中的表与表之间的关系的一种模式。
ORM 可以理解成一种规范,它概述了这类框架的基本特征:完成面向对象的编成语言到关系数据库的映射。
1.1.2 基本映射方式:
》 数据表映射类:持久化类被映射到一个数据表。当我们使用这个持久化类(就是一个普通的Java类)来创建实例、修改属性、删除实例时,系统自动会转换为对这个表进行CRUD操作( 增加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作 )。
》 数据表的行映射对象:持久化类会生成很多实例,每个实例就对应数据表中的一行数据。
》 数据表的列映射对象属性:
基于这这种基本的映射方式,ORM工具可以完成对象模型和关系模型之间的相互映射。所以,持久化对象是一种中间媒介,应用程序只需操作持久化对象,ORM 框架负责将这中操作转换为底层数据库操作。
1.2.1、Hibernate体系结构:
Hibernate 作为 模型层/数据访问层。它通过配置文件(hibernate.cfg.xml 或 hibernate.properties)和映射文件(*.hbm.xml)把java对象或持久化对象映射到数据库中的数据表,然后通过操作PO(Persistent Object,持久化对象),对数据库中的表进行各种操作。
2.1.1 Hibernate 核心接口
Hibernate 核心接口一共有5个 : Configuration 、SessionFactory 、 Session 、 Transaction 和 Query。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。
1、Configuration 接口
该接口负责管理Hibernate 的配置信息。Hibernate 运行时需要一些底层实现的基本信息。。这些信息包括:数据库URL、数据库用户名等等。
使用Hibernate 必须首先提供这些信息以完成初始化工作,为后续操作做好准备。这些信息在 Hibernate 配置文件 hibernate.cfg.xml 中。当调用:
Configuration config = new Configuration().configure() ;
时,Hibernate 会自动在目录下搜索 hibernate.cfg.xml 文件, 并将其读取到内存中作为后续操作的基础配置。
2、SessionFactory 接口
SessionFactory 负责创建 Session 实例。可以通过Configuration 实例构建
Configuration config = new Configuration().configure() ; SessionFactory sessionFactory = config.buidSessionFactory() ;
SessionFactory 保存了对应当前数据库配置的所有映射关系。同时也负责维护当前的二级数据缓存和Statement Pool。
注意:SessionFactory 构造完毕之后,即被赋予了特定的配置信息。之后config 的任何变更将不会影响到已经创建的SessionFactory实例。
3、Session 接口
该接口是 Hibernate持续化操作的基础,提供了众多持久化的方法,如 save、update、delete 等。Session 实例有 SessionFactory 构建:
Configuration config = new Configuration().configure() ; SessionFactory sessionFactory = config.buidSessionFactory() ; Session session = sessionFactory.openSession() ;
4、Tarnsaction 接口
该接口是 Hibernate 中进行事务操作的接口 , Transaction 接口是对实际事务实现的一个抽象,这些实现包括 JDBC 的事务、JTA 中的 UserTransaction 等等。
5、Query 接口
Query 接口用于执行 HQL 语句。Query和HQL是分不开的。
注意:为了使用Hibernate 进行持久化操作,通常有如下操作步骤:
1、开发持久化类,由POJO加映射文件组成。
2、获取Configuration 。
3、获取SessionFactory 。
4、获取Session , 打开事务。
5、用面向对象的的方式操作数据库。
6、关闭事务,关闭Session 。
2.2.1 HQL 查询
HQL(Hibernate Query Language ) ,语法很像SQL , 但HQL 是一种 面向对象的查询语言。SQL 的操作对象是数据表和列等数据对象,而 HQL 的操作对象是 类、实例、属性等,
HQL 的查询依赖 于 Query 类, 每个Query 实例对应一个查询对象。使用HQL查询按如下步骤进行:
1、获取Hibernate Session 对象。
2、编写HQL语句。
3、以HQL语句作为参数,调用Session 的 createQuery 方法创建查询语句。
4、如果HQL语句包含参数,则调用Query 的 setXXX 方法赋值。
5、调用Query 对象的list 等方法反悔查询结果列表(持久化实体集)。
HQL 的几种常用的查询方式:
1、基本查询:
2、条件查询:
3、分页查询:
(未完.........)
3.1 Hibernate 关系映射
Hibernate 关系映射的主要任务是实现数据库关系表与持久化类之间的映射。
3.1.1 一对一关联:
Hibernate 有两种映射实体一对一关联关系的实现方式:共享主键方式和唯一外键方式。
共享主键方式:就是限制两个数据表的主键使用相同的值。
唯一外键方式:就是一个表的外键和另一个表的唯一主键对应形成一对一映射关系。
1、共享主键方式:
在注册时,往往不但要填写 登录账户和密码,还要填写其他的详细信息,这两部分信息通常会放在不同的表中。这时登录表和详细信息表属于典型的一对一关系,可以按共享主键方式进行。
在进行该关联时要对POJO类的ORM映射文件*.hbm.xml 进行修改:
如:
Login 表 与 Login 类的ORM映射文件 Login.hbm.xml 文件在<class...></class>标签中添加:
<!-- name 表示属性名字,class表示被关联的类的名字 --> <one-to-one name = "detail" class = "org.model.Detail" constrained = "true" />
而 detail 表 与 Detail 类的 ORM 映射文件 Detail.hbm.xml 文件中添加:
<!-- name 表示属性名,class 表示被 关联类的名字,cascade = "all" 表明 主控类的所有操作,对关联类也执行同样的操作,lazy="false"表示此关联为立即加载 --> <one-to-one name = "login" class = "org.model.Login" cascade = "all" lazy = "false" />
2、唯一外键方式:
多对一的特殊情况。
3.1.2 多对一单向关联:
如每个人对应一个房子。但是可以几个人住在同一个房子里面,就是多对一的关系。
如:在 Person 表与Person 类的ORM 映射文件 Person.hbm.xml 中添加:
<!-- name 表示属性名,column = "room_id" 充当外键的字段名,class 表示被 关联类的名字,cascade = "all" 表明 主控类的所有操作,对关联类也执行同样的操作. --> <many-to-one name = "room" column = "room_id" class = "org.model.Room" cascade = "all" />
在room 表 与 Room 类的ORM 映射文件不需要做出什么修改。
3.1.3 一对多双向关联:
3.1.4 多对多关联:
1、多对多单向关联:
2、多对多双向关联:
4.1 Hibernate 高级功能
Hibernate 还有一些高级特性,如批量处理、事务管理等。
4.1.1 实体对象生命周期
1、transient (瞬时态)
瞬时态,即实体对象在内存中的存在,与数据库中的记录无关。如:
Student stu = new Student() ;
stu.setStuNumber("110") ;
stu.setStuName("jbelial") ;
stu.setStuAge(19) ;
这里的stu对象,与数据库中的记录没有任何关联。
2、persisent (持久态)
持久态是指对象处于由 Hibernate 框架所管理的状态。在这种状态下,实体对象的引用被纳入 Hibernate 实体容器中加以管理。处于持久状态的对象,其变更将由Hibernate 固化到数据库中。
处于瞬时态的对象,可以通过Session 的save() 方法转换成持久状态。如果一个实体对象由Hibernate 加载,那么 ,他也处于持久状态。
3、Detached (脱管状态)
处于持久态的对象,其对应的Session 实例关闭之后,此对象处于脱管状态。
4.1.2 Hibernate 事务管理
每一个业务逻辑方法都是由一些列的数据库访问完成的,这一些列的数据访问可能会修改多条数据记录,这一些列的修改应该是一个整体,绝对不能仅修改其中的几条。也就是说,多个数据库原子访问应该绑定成一个整体——这就是事务。
概念:
事务是一步或几步基本操作组成的逻辑执行单元,这些基本操作作为一个整体执行单元,他们要么全部执行,要么全部取消,绝对不能仅仅执行部分。
事务是数据库并发控制不可分隔的基本工作单位,具有原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)的特点(简称ACID)。
原子性(Atomicity) :事务是应用中不可再分的最小逻辑执行体。
一致性(Consistency):事务执行的结果,必须使得数据库从一个一致状态,变到另一个一致状态。
隔离性(Isolation):各个事务的执行互不干扰。
持久性(Durability):事务一但提交,对数据所做的任何改变,都要永久记录储存器中。
4.1.2.1 Session 与 事务
Hibernate 的事务 (Transaction 对象)通过Session 的beginTransaction()方法显示打开。Hibernate 自身并不提供事务控制行为,Hibernate底层直接使用JDBC 连接 ,JTA资源或其他资源事务。
Hibernate 建议采用每个请求对应一次Session的模式——因此一次请求通常表示需要执行一个完整的业务功能,这个功能由系列的数据库操作组成,而且它们应该逻辑上的整体。