SSH-Hibernate(二)—映射关系(下)

    前面已经讲了一对一和一对多关系使用Hibernate的映射。还剩下多对多关联和继承映射没有讲,这篇博客是想把这两个一块都总结了。

多对多表关系

    关系型数据库无法直接表达多对多的关系,需要引入中间表以外键关联的方式来表达。如下图:


    多对多单向关联映射

    单向多对多关联映射,是在其中一端加入一个属性保存另一端的对象集合。而在另一端则不需要。看到这里你可能会有疑问,这不是和一对多关联一样吗?我们以在Categories一端作为持有者来看。

看到这个类图确实是和一对多关联里的单向映射方式没有区别。我们接着再看它的配置方式:
<class name="Category" table="t_category">  
        <id name="category_id">  
            <generator class="native"/>  
        </id>  
        <property name="category_name"/>  
        <set name="items" table="t_catetory_item">  
            <key column="item_id"/>  
            <many-to-many class="Item" column="item_id"/>  
        </set>  
</class>  


<class name="Item" table="t_item">  
        <id name="item_id">  
            <generator class="native"/>  
        </id>  
        <property name="item_basePrice"/>  
</class>  

    从配置方式里可以看见和一对多关系映射的区别在于:对应了中间表t_category_item。也就是说category持有的item不是直接持有,而是通过了中间的关系去对应持有的对象有什么。而一对多关联因为其中一端来说是唯一的,则可以直接持有。

    多对多双向关联

     双向关联就是两端都持有对方,看过了一对多的双向和前面的单向多对多应该很容易理解了。这里就不再多说,看看类图和配置吧。
    SSH-Hibernate(二)—映射关系(下)_第1张图片      
<class name="Category" table="t_category">  
        <id name="category_id">  
            <generator class="native"/>  
        </id>  
        <property name="category_name"/>  
        <set name="items" table="t_catetory_item">  
            <key column="item_id"/>  
            <many-to-many class="Item" column="item_id"/>  
        </set>  
</class>  


<class name="Item" table="t_item">  
        <id name="item_id">  
            <generator class="native"/>  
        </id>  
        <property name="item_basePrice"/> 
        <set name="categories" table="t_catetory_item">  
            <key column="category_id"/>  
            <many-to-many class="Item" column="category_id"/>  
        </set>  		
</class>  

继承映射

    继承关系的映射呢看上去和之前的好像很不同,这里为了帮助理解需要说明一点。之前我们讨论映射关系都是从关系型数据库的角度出发,以类之间的关系去表达数据之间的关系。这在理解上没有什么问题,但是放在继承映射里就有问题了,因为数据库中并不存在继承关系。所以,我们要换个角度了,以关系型数据库来表达类的继承关系。我们先看类图:
SSH-Hibernate(二)—映射关系(下)_第2张图片

    三种映射方式

  • 使用 subclass 进行映射:将每一个实体对象映射到一个独立的表中,也就是说不用在关系数据模型中考虑继承关系和多态。 
  • 使用 joined-subclass 进行映射: 对于继承关系中的子类使用同一个表,这就需要在数据库表中增加额外的区分子类类型的字段。 
  • 使用  union-subclass 进行映射:每个类映射到一个表,通过关系数据模型中的外键来描述表之间的继承关系。这也就相当于按照类的结构来建立数据库中的表,并通过外键来建立表之间的继承关系。

    这里就不写如何配置了,太长了。
    总结:映射关系的学习到了这里就告一段落了,总结如下:
          第一,关系映射的出发点应该是:如何在关系型数据库中表达,类之间的关系。使关系型数据库对象化。
          第二,所有的映射关系的本质都是:在哪一个对象里作为属性保存有另一个的对象或者对象集合
          第三,对于数据的访问的方向是:谁持有谁就是访问入口

你可能感兴趣的:(SSH-Hibernate(二)—映射关系(下))