基础知识
持久层是 MODEL 层的主要组成部分。是在系统逻辑层面上,专注于实现数据持久化的一个相对独立的领域。代表着某个系统中的一个逻辑层次,这个层次将数据使用者与数据实体相关联。
Hibernate 是一种“对象 — 关系型数据映射组件”,根据 Object 和数据库存定义,就要以通过映射文件建立两者之间的关联(映射)关系,这也就是所谓的 Mapping 。映射文件通常以“ .hbm.xml ”作为后缀名
一个 Hibernate 应用的创建步骤:
1. 创建数据库。
2. 构建 Hibernate 基础代码,定义关系型数据表与实体类之间的映射关系。
1) Hibernate 基础代码包括 POJO 类和 Hibernate 映射文件。
2) POJO 在 Hibernate 语义中理解为数据库表所对应的 Domain Object ,是一个不包含逻辑代码的值对象( VO ),从数据层面上来看, POJO 作为数据实体的对象化表现形式,也称为实体类。
3) 构建 Hibernate 基础代码有以下途径:
l 手工编写。根据实体类及表结构的对应关系,按照 Hibernate 映射规范人工编写。
l 根据数据库定义导出表结构,并生成映射文件和 JAVA 代码(推荐)。
l 根据现有的 JAVA 代码生成对应的映射文件,从而将 JAVA 代码与数据库表相绑定。
4 )通过 Hibernate 官方提供的 MiddleGen fo Hibernate 和 Hibernate_Extension 工具包,可以从现有数据库导出表结构,并生成对应的映射文件和 POJO 代码。
3. 完成 Hibernate 基础配置。
l Hibernate 配置文件主要用于配置数据库连接和 Hibernate 运行时所需用的各种属性。
l 配置文件名默认为“ Hibernate.cfg.xml ”, Hibernate 初始化期间会自动在 CLASSPATH 中寻找这个文件,并读取其中的配置信息,为后期数据库操作做好准备。
二 基础语义
1 . Configuration 类:负责管理 Hibernate 的配置信息。 Hibernate 运行时需要获取一些义愤实现的基本信息,其中几个关键属性包括:
数据库 URL ;数据库用户;数据库用户密码;数据库 JDBC 驱动类;数据库适配器( dialect, 用于对特定数据库提供支持)
l 当调用: Configuration config=new Configuration().configure(); 时, Hibernate 会自动在当前的 CLASSPATH 中搜寻 Hibernate.cfg.xml 文件并将其加载至内存中,作为后继操作的基础配置。
l Configuration 类一般只有在获取 SessionFactory 时需要涉及,当 SessionFactory 实例创建之后,由于配置信息已经由 Hibernate 绑定在返回的 SessionFactory 之中,因此一般情况下无需再对其操作。
2 . SessionFactory 负责创建 Session 实例。可以通过 Configuration 实例构建 SessionFactory:
Configuration config=new Configuration().configure();
SessionFactory sessionFactory=config.buildSessionFactory();
Configuration 实例 config 会根据当前的数据库配置信息,构造 SessionFactory 实例并返回。 SessionFactory 一旦构造完毕,即被赋予特定的配置信息。
l SessionFactory 构造完毕后,将不再受 config 的影响。
l 如果应用中访问多个数据库,则针对每个数据库应分别为其创建对应的 SessionFactory 实例。
l SessionFactory 中保存了对应当前数据库配置的所有映射关系,同时也负责维护当前的二级数据缓存和 statement pool 。
1. Session :是 Hibernate 持久化操作的基础。与传统意义上的 Web 层的 HttpSession 没有关系。 Hibernate Session 之与 Hibernate, 相当于 JDBC Connection 之与 JDBC.
l Session 作为贯穿 Hibernate 的持久化管理器核心,提供了众多持久方法如 save,update,delete,find 等。通过这些方法,可以透明地完成对象的增删改查。非线程安全。
l Session 实例由 SessionFactory 构建:
Configuration config=new Configuration().configure();
SessionFactory sessionFactory=config.buildSessionFactory();
Session session=sessionFactory.openSession();
之后就可以调用 Session 所提供的 save,get,delete,find 等方法完成持久层操作。
l Hibernate 3 中的 Session 接口取消了 find 方法,必须通过 Query 或 Criteria 接口进行数据查询 , 这两个查询接口,提供了对查询条件的封装机制。
两者的不同在于, Query 面向 HQL 和 Native SQL ,而 Criteria 提供了面向对象的查询模式。
String hql=”from TUser user wher user.name like ?”;
Query query=session.creatQuery(hql);
三 基础配置:
四 ORMapping:对象关系映射
通过一个类的操作来代表数据库中的操作 类中的方法对应SQL语句 Hibernate是一个ORMapping的实现,主要的功能就是以对象的形式操作数据库.它提供了强大的对象和关系数据库映射以及查询功能.使用Hibernate操作数据库的代码量很少,用户像使用对象一样使用数据库,所有的操作过程都是通过POJO类完成。 Hibernate开发步骤: 1、持久化类的设计(POJO类,只包含setter和getter方法的类) 2、持久化类和关系数据库的映射(HBM映射,描述类和表之间的关系) 3、应用的开发 Hibernate最好的使用方法是使用普通的JAVA对象(POJO)这种编程模型来进行持久化。
一个基本的映射文件形式: <hibernate-mapping package="POJO类所在的包"> <class name="类的完整路径" table="数据库表名"> <id name="id" type="主键的类型" column="对应表中的列名"> <generator clsaa="指定主键的生成方式"> </id> <property name="POJO中的属性名" type="类型" column="对应数据库表中的列名"> ...... </class> </hibernate-mapping>
hibernate.cfg.xml:对Hibernate环境进行配置,包括使用的数据库或数据通信源方言(所要使用的数据库类型)。
POJO类的名称最好与表名称一致,只是首字母大写。
在Hibernate中操作数据库使用Session,可以通过SessionFactory实例化。
主键生成方式: assigned:指派 Sequence:自动增长的数据段 uuid.hex:生成一个32位不会重复的主键
SessionFactory可以生成Session实例,可在多个应用线程中共享,一般情况下,一个应用只有一个SessionFactory,其中缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据。
session不是线程安全的,它代表与数据库之间的一次操作,它的概念介于Connection和 Transaction(事务)之间。也称为持久化管理器,与持久化操作有关的一个接口。所有的工作完成后,需要关闭。操作中所使用的Query对 象,Transaction对象都是通过Session取得的
Transaction将应用代码从底层的事务实现中抽象出,可能是一个JDBC事务,也可能是一个JTA事务,使用Hibernate进行操作(增\删\改)时必须显示地调用Transaction(默认:autoCommit=false)
五 细粒度模型
细粒度模型就是将原本业务模型中的对象加以细分,得到更多的对象. 对于Hibernate,所谓细粒度模型,主要是针对实体类设计的对象细分。主要有两个目的: 面向设计的粒度细分:实现更加清晰的系统逻辑 面向性能的性能细分:提高系统的能耗比
对象的细分更多地体现在实体的关联,对于细分后的类,数据库中都会有与之对应的表。通过表之间的逻辑组合成为最终的实体对象。
在Hibernate中可以通过Component节点来完成对表的对象的细分。在Hibernate中将某个实例的对象中的一个逻辑组成称为component.它与实体对象的根本区别就在于它没有标识(ID),它作为一个逻辑组成,完成从属于实体对象。
对于表的对象细分,在Hibernate中可以借助Component节点的定义完成。 在Hibernate中将某个实例对象中的一个逻辑组成称为一个Component。它与实体对象的根本差别在于它没有标识,它作为一个逻辑组成,完全从属于实体对象。
基本格式<component name="POJO类名" class="类的完整路径"> <property name="属性名" type="类型" column="对应数据库表中的列" length="长 .......... </component>
六 Hibernate支持三种类型的继承形式
Hibernate支持三种类型的继承形式: 1、表与子类之间的独立一对一关系。 2、每个子类对应一张子表,并与主类共享主表。 3、表与类的一对多关系。
对于第一种情况:每个子类需要一个映射文件 对于第二种情况:虽然每个子类各对应一个表,但只有一个映射文件,子表与主表的映射关系通过joined-subclass来进行设置。 <joined-subclass name="子类的完整路径" table=“子类对应的表的名称”> </joined-subclass> 对于第三种情况,只用一张表来完成信息存储,通过在数据库层次上增加一个用以区别不同子类的字段,并在映射文件中使用discriminator和subclass进行设置即可。 <discriminator column="用以区别不同子类的字段名" type="类型"></discriminator> <subclass name="子类完整路径" discriminator-value="对应该子类的字段值">
由于业务的需求,有时会使用多个字段作为复合主键
为实现复合组键,在POJO类中必须实现Serializable接口,且必须覆写equals()和hasCode()方法,对于这两个方法的覆写,可以使用第三方工具commons-lang-1.0.1.jar
在映射文件中进行如下配置: <composite-id> <key-property name="属性名1" type="类型1" column="对应数据库表中的列1" length="长度1"> <key-property name="属性名2" type="类型2" column="对应数据库表中的列2" length="长度2"> ........... </composite-id>
Hibernate 的基础配置主要围绕 SessionFactory 展开。
1 .配置 SessionFactory :完成配置文件和映射文件加载之后,就得到了一个包含了所有 Hibernate 运行期参数的 Configuration 实例,通过这个实现,可以构建一个唯一的 SessionFactory 。
l 数据库连接配置:在 Hibernate 中,可以设置两种数据库访问策略:一种是根据指定的 JDBC 参数进行数据库连接,由 Hibernate 来完成连接管理过程。另外一种是通过 JNDI 完成数据库连接获取。只可选其一。
l 数据库连接池配置:如果使用 JDBC 方式访问数据库,可以为其指定数据库连接池实现, Hibernate 支持四种连接池组件:默认数据库连接池, C3P0 , dbcp , Proxool 。
2 .事务管理:为了使用 Hibernate 的 Transaction API, 必须通过 Hibernate.transaction.factory_class 属性指定一个 Transaction 实例工厂类。 Transaction API 隐藏了义愤的事务机制,允许 Transaction API 代码在受管制和非受管制的环境下都可以运行。
l 使用 JDBC 的事务处理机制。
l 使用 JTA