Hibernate 大纲

来源:互联网 发布:恐怖的事 知乎 编辑:程序博客网 时间:2024/04/27 14:11

Hibernate

 

 一.  继承映射 

 

1、每个类继承树对应一张表;

    采用这种策略只需要一张表即可。它有一个很大的限制:要求那些由子类定义的字段, 如CCTYPE,不能有非空(NOT NULL)约束

 

2、每个子类一张表 ;

    需要四张表。三个子类表通过主键关联到超类表(因而关系模型实际上是一对一关联)。

 

3、每个具体子类一张表;

    第一种方法是使用 <union-subclass>:这种方式的局限在于,如果一个属性在超类中做了映射,其字段名必须与所有子类 表中定义的相同

    另一种可供选择的方法是采用隐式多态:这种方法的缺陷在于,在Hibernate执行多态查询时(polymorphic queries)无法生成带 UNION的SQL语句。

 

继承策略(Inheritance strategy)多态多对一多态一对一多态一对多多态多对多多态 load()/get()多态查询多态连接(join)外连接(Outer join)读取每个类分层结构一张表<many-to-one><one-to-one><one-to-many><many-to-many>s.get(Payment.class, id)from Payment pfrom Order o join o.payment p支持每个子类一张表<many-to-one><one-to-one><one-to-many><many-to-many>s.get(Payment.class, id)from Payment pfrom Order o join o.payment p支持每个具体类一张表(union-subclass)<many-to-one><one-to-one><one-to-many> (仅对于inverse="true"的情况)<many-to-many>s.get(Payment.class, id)from Payment pfrom Order o join o.payment p支持每个具体类一张表(隐式多态)<any>不支持不支持<many-to-any>s.createCriteria(Payment.class).add( Restrictions.idEq(id) ).uniqueResult()from Payment p不支持不支持

 

 二.  组合映射  : <component> 元素还允许有 <parent>子元素 

   1、联合主键:   <composite-id> 标签(并且内嵌<key-property>元素)

  2、动态组件:  <dynamic-component name="userAttributes">

  3、组件集合: <composite-element>  <nested-composite-element>  <composite-map-key>

   4、 三重或多重关联  <many-to-one>  many-to-many 

  

 三.  集合映射

       Hibernate中的集合分为五类: 
            1.bag类:元素无序,可重复 
            2.set类:元素无序,不可重复 
            3.list类:元素有序,可重复 
            4.array类:数组 
            5.map类:映射关系 
        除bag类集合外,其它集合都可以在java api中找到对应的接口类,bag可以认为对应java中的List 
        Hibernate中将集合分为3类: 
            一是值集合,集合中存储的都是基本数据类型,包括String类型,及其它可识别的数据库类型 <element>
            二是实体集合,集合中存储已经映射了的实体对象,反应对象间的关系。(一对多 和 多对多

            三是组件集合 <composite-element>

        <idbag>  联合主键

    

       集合排序: 1. 在数据库排序 order by   2. 在内存中排序 sort  自然排序 或者 客户化排序

       过滤集合

    Collection blackKittens = session.createFilter(
        pk.getKittens(), 
        "where this.color = ?")
        .setParameter( Color.BLACK, Hibernate.custom(ColorUserType.class) )
        .list()
    );

        集合性能优化

        <idbag>映射定义了代理键,因此它总是可以很高效的被更新。事实上, <idbag>拥有着最好的性能表现

        Bag是最差的。因为bag允许重复的元素值,也没有索引字段,因此不可能定义主键。 Hibernate无法判断出重复的

        行。当这种集合被更改时,Hibernate将会先完整地移除 (通过一个(in a single DELETE))整个集合,然后再重新

        创建整个集合。 因此Bag是非常低效的。

        可论证的是对于多对多关联、值数据集合而言,有序集合类比集合(set)有一个好处。

        数组无法延迟载入,我们可以得出结论,list, map和idbags是最高效的(非反向)集合类型,set则紧随其后。

 

 四.  关联映射

1.      单向多对一关联是最常见的单向关联关系

2.      基于外键关联的单向一对多关联是一种很少见的情况,并不推荐使用

3.      基于连接表的单向一对多关联 应该优先被采用 请注意,通过指定unique="true",我们可以把多样性从多对多改变为一对多

4.      基于连接表的单向多对一关联在关联关系可选的情况下应用也很普遍

5.      双向多对一/一对多关联 是最常见的关联关系。(这也是标准的父/子关联关系。)

6.      双向一对多自身关联(树形结构)

7.      基于连接表的双向一对多/多对一关联。注意inverse="true"可以出现在关联的任意一端,即collection端或者join

 

8.      基于外键关联的单向一对一关联和单向多对一关联几乎是一样的。唯一的不同就是单向一对一关联中的外键字段具有唯一性约束

9.      基于主键关联的单向一对一关联通常使用一个特定的id生成器

10.   基于外键关联的双向一对一关联也很常见

11.   基于主键关联的双向一对一关联需要使用特定的id生成器

12.   基于连接表的双向一对一关联极为罕见,但也是可行的

13.   基于连接表的单向一对一关联非常少见,但也是可行的

 

14.   最后,还有 单向多对多关联.

15.   最后,还有 双向多对多关联.

    

   

                               

 五.  操作持久化类

            对象的三种状态   

            session的清理缓存flash() 时间点  三种模式

            sessionget() load() find(SQL) 这三个的区别    save()  saveOrUpdate()  update()  merge()

                                                      delete()   close()  evict()  lock()  persist()

            级联操纵对象图:    saveOrUpdate()   iterator()    cacade属性

 

 六.  检索策略

            三种检索策略  (另外 批量检索)   lazy属性  outer-join属性  batch-size属性

            迫切左外连接的限制  和 配置  显示设置(HQL)   

            iterator() 与 list()  遍历对象图

            HQL   SQL    多态查询  分页查询   连接查询  报表查询   高级查询   查询性能优化  

          批量处理    batch-size属性

 

 七.  拦截器(安全)  事件框架    事务 并发

 

八.    缓存

一级缓存   二级缓存   查询缓存   管理缓存   集合缓存

 

 九.  配置

 

 十.  与Spring 集成

原创粉丝点击