hibernate映射(二)——一对多VS多对一

在没有学习hibernate映射之前,我一直认为一对多就是多对一,二者根本没有任何区别,直到现在,我觉得是我太任性了,存在皆有道理。
然而在关系模型中,二者之间却存在很多的解释。

对象模型

在对象模型中,二者确实没有任何区别,一对多就可以说成多对一,只不过是方向上的改变而已。例如:班级与学生之间是一对多,
反过来,学生与班级之间就是多对一的关系了。

hibernate映射(二)——一对多VS多对一_第1张图片

当然这仅仅是面向对象的思维方式,(面向对象是更容易让人理解和接受而产生的)而实际操作过程中真正能对数据起到作用的
还是对象之间的各种关系。所以我们不得不考虑关系模型。

在对象模型中,也就是我们平常所建的实体类。维护实体类之间关系是靠外键来完成的。多对一:在多的一端建立一的外键,一对多:是在一的一方多的一方的外键的集合,用以表示对象之间的关系

关系模型

多对一
对象模型中如果出现多对一的情况,是在多的一方的实体类中加入一个外键来维护。那么在关系模型中,到底是如何体现这个外键的作用的呢?

hibernate中利用了一个的标签来进行维护。使得数据库在查询多的一方的时候,可以自动加载外键关联的对象。
以学生对班级为例:

    <class name="com.bjpowernode.hibernate.Student" table="t_student">
        <id name="id">
            class="native"/>
        id>
        <property name="name"/>
        to-one name="classes" column="classesid"/>
    class>

一对多

参照多对一的想法,应该是在一的一端来加多的一端的外键的集合才可以。
没错,我们在建立实体时,会在classes班级的一端来创建student的一个集合来维护他们之间的一对多关系。
而关系模型中也是同样的原理:
<hibernate-mapping>
    <class name="com.bjpowernode.hibernate.Classes" table="t_classes">
        <id name="id">
            <generator class="native"/>
        id>
        <property name="name"/>
        <set name="students" inverse="true">
            
             <key column="classesid"/>
            <one-to-many class="com.bjpowernode.hibernate.Student"/>
        set>
    class>
hibernate-mapping>
这里用set来表示多的一方外键的集合,key在这里代表了多的一方参照的标识,也就是我们平常理解的一对多的一到底指的是谁。
这里需要特别说明的是inverse="true"这个属性的使用。我们说通过这种映射关系,数据库在查询时,会自动加载所关联的数据。
那么如果在一对多的情况下增加这种集合关系,在加载一个班级时,会自动加载班级中的所有学生,这样如果数据量足够大的话,
会给数据库造成很大的压力,大大的影响性能。所以,通常我们采用inverse="true"这个属性来进行反转,将关系反转成多对一。
这样在加载的时候就会避免这些问题了。

小结

一对多和多对一映射原理是一样的。在面向对象的思维中二者没有区别。不同的是维护的关系不同。在实体类中通过外键进行维护。
程序映射到数据库关系中是通过映射映射文件中的(通常使用set为了更好的扩展)来进行维护的。

你可能感兴趣的:(SSH,hibernate,一对多,多对一,映射关系)