Hibernate技术

Hibernate是一种“对象关系型数据映射组件”,根据Object和数据库存定义,就要以通过映射文件建立两者之间的关联(映射)关系,这也就是所谓的Mapping。映射文件通常以“.hbm.xml”作为后缀名
    一个Hibernate应用的创建步骤:
1. 创建数据库。
2. 构建Hibernate基础代码,定义关系型数据表与实体类之间的映射关系。
1)      Hibernate基础代码包括POJO类和Hibernate映射文件。
2)      POJOHibernate语义中理解为数据库表所对应的Domain Object,是一个不包含逻辑代码的值对象(VO),从数据层面上来看,POJO作为数据实体的对象化表现形式,也称为实体类。
3)      构建Hibernate基础代码有以下途径:
l         手工编写。根据实体类及表结构的对应关系,按照Hibernate映射规范人工编写。
l         根据数据库定义导出表结构,并生成映射文件和JAVA代码(推荐)。
l         根据现有的JAVA代码生成对应的映射文件,从而将JAVA代码与数据库表相绑定。
4)通过Hibernate官方提供的MiddleGen fo HibernateHibernate_Extension工具包,可以从现有数据库导出表结构,并生成对应的映射文件和POJO代码。
3. 完成Hibernate基础配置。
l         Hibernate配置文件主要用于配置数据库连接和Hibernate运行时所需用的各种属性。
l         配置文件名默认为“Hibernate.cfg.xml”,Hibernate初始化期间会自动在CLASSPATH中寻找这个文件,并读取其中的配置信息,为后期数据库操作做好准备。
1Configuration类:负责管理Hibernate的配置信息。Hibernate运行时需要获取一些义愤实现的基本信息,其中几个关键属性包括:
数据库URL;数据库用户;数据库用户密码;数据库JDBC驱动类;数据库适配器(dialect,用于对特定数据库提供支持)
l         当调用:Configuration config=new Configuration().configure();时,Hibernate会自动在当前的CLASSPATH中搜寻Hibernate.cfg.xml文件并将其加载至内存中,作为后继操作的基础配置。
l         Configuration类一般只有在获取SessionFactory时需要涉及,当SessionFactory实例创建之后,由于配置信息已经由Hibernate绑定在返回的SessionFactory之中,因此一般情况下无需再对其操作。
2SessionFactory负责创建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方法,必须通过QueryCriteria接口进行数据查询,这两个查询接口,提供了对查询条件的封装机制。
两者的不同在于,Query面向HQLNative 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支持四种连接池组件:默认数据库连接池,C3P0dbcpProxool
2.事务管理:为了使用HibernateTransaction API,必须通过Hibernate.transaction.factory_class属性指定一个Transaction实例工厂类。Transaction API隐藏了义愤的事务机制,允许Transaction API代码在受管制和非受管制的环境下都可以运行。
l         使用JDBC的事务处理机制。
l         使用JTA
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章