Hibernate第四讲:Hibernate对象的状态和映射

来源:互联网 发布:java 界面 表格 编辑:程序博客网 时间:2024/06/06 13:18

一、 Hibernate对象的状态

    实体对象的三种状态:
    1) 暂态(瞬时态)(Transient)---实体在内存中的自由存在,它与数据库的记录无关。
        po在DB中无记录(无副本),po和session无关(手工管理同步)
        如:Customer customer = new Customer(); customer.setName("eric");
        这里的customer对象与数据库中的数据没有任何关联
    2) 持久态(Persistent)---实体对象处于Hibernate框架的管理中。
        po在DB中有记录,和session有关(session自动管理同步)
    3)游离态(脱管态)(Detached)
        处于Persistent状态的实体对象,其对应的Session实例关闭之后,那么,此对象处于Detached状态。
        po在DB中有记录,和session无关(手工管理同步)
      无名态:po处于游离态时被垃圾回收了。没有正本,只有DB中的副本。
      po处于暂态时被垃圾回收了,则死亡。(唯一可以死亡的状态)

    实质上,这三个状态是:持久对象的正副本与同步的关系
    原则:尽量使用持久态。
 
        暂态--->持久态
            A.调用Session接口上的get()、load()方法
            B.调用Session接口上的save()、saveOrUpdate()方法
        持久态--->暂态
            delete();
        游离态--->持久态
            update()、saveOrUpdate()、lock();
            (lock不建议用,危险;肯定没变化时用,有则用updata)
        持久态--->游离态
            evict()、close()、clear()
            (一般用evict,只关闭一个实体的连接;close关闭整个连接,动作太大)

二、 映射(重点掌握和理解,注意配置的细节)

    关联关系:A有可能使用B,则AB之间有关联关系(Java里指A有B的引用)。
            双边关系、传递性、方向性、名称、角色(权限)、数量(1:1;1:m;n:m)、关联强度
    委托:整体跟部分之间是同一类型。    代理:整体跟部分之间不是同一类型。
    A. 单一实体映射:最简单、基本映射(最重要);任何其他映射种类的基础。
       原则:1.类->表;一个类对应一个表。
            2.属性->字段:普通属性、Oid;一个属性对应一个字段。
    B. 实体关系映射:
       a.关联关系映射:(最难、量最多)
           1.基数关系映射:
             一对一(one to one) (共享主键、唯一外键)
             一对多(one to many) (1:m) 作级联,删one后连着删many
             多对一(many to one) (m:1) 不作级联,删many中一个,不删one
             多对多(many to many)(n:m = 1:n + m:1)
           2.组件关系映射:(一个类作为另一个类的零件,从属于另一个类,没有自己的XML)
             单一组件关系映射
             集合组件关系映射
       b.继承关系映射:(最普遍。两个类有继承关系,在本质上他们就是一对一关系。共享主健。)
           有三种映射方案:
           1.一个类一个表(效率很低;最后考虑使用,一般是数据量较大和父子类重复字段不多的时候用)
             只有当子类中的属性过多时才考虑每个类建一个表的策略。
           2.一个实体一个表(多表查询效率低,不考虑多态时用)
             不考虑多态时,最好是用只针对具体类建表,而考虑多态时尽量使用所有类建一个表
           3.所有类一个表(查询效率最高,结构简单;字段数不超过100个时使用,首选)

       c.集合映射(值类型)
           Set   不重复、无顺序
           List  可重复、有顺序
           Map   
           Bag   可重复、无顺序(bag本身也是list实现的)
    双向关联(Bidirectional associations)(相当于两个单向关联)  
    单向关联(Unidirectional associations)

    "一"方的配置:
    <!-- 表明以Set集合来存放关联的对象,集合的属性名为orders;一个"customer"可以有多个"order" -->
    <!-- inverse="true"表示将主控权交给order,由order对象来维护关联关系,
         也就是说order对象中的关联属性customer的值的改变会反映到数据库中 -->
    <set name="orders" cascade="save-update" inverse="true">
        <!-- 表明数据库的orders表通过外键customer_id参照customer表 -->
        <key column="customer_id"/>    
        <!-- 指明Set集合存放的关联对象的类型 -->
        <one-to-many class="many_to_one.vo.Order"/>
    </set>

    "多"方的配置:
    <many-to-one
        name="customer"
        class="many_to_one.vo.Customer"
        column="customer_id"
        not-null="true"
        cascade="save-update"
        />

    cascade属性:设定级联操作(插入、修改、删除)。
    cascad属性值                 描述
    -------------------------------------------------------------------------
    none                 保存、更新或删除当前对象时,忽略其他关联对象,默认属性值
    save-update          通过Session的save()、update()以及saveOrUpdate()方法来保持、更新当前对象时级联
                         所有关联的新建对象,并且级联更新所有有关联的游离对象
    delete               当通过Session的delete()方法来删除当前对象时,级联删除所有关联对象
    all                  包含所有的save-update以及delete行为
    delete-orphan        删除所有和当前对象解除关联关系的对象
    all-delete-orphan    包含all与delete-orphan的动作

    inverse属性:表示是否将当前属性的值的变化反映到数据库中去。
            false --- 表示反映到数据库中
            true ---表示不反映到数据库中
    Set的lazy属性:
       A.不设置lazy值,默认true    现象:查询Customer时,不会主动查询关联表Orders(SQL语句)
       B.设置lazy=false          现象:出现查询Orders表的SQL语句

    3、多对多
        默认情况下,由两方共同维护关联关系。也就是两个对象关联属性的值的改变都会反映到数据库中。
0 0
原创粉丝点击