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

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

对象模型

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

这里写图片描述

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

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

关系模型

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

hibernate中利用了一个<manay-to-one>的标签来进行维护。使得数据库在查询多的一方的时候,可以自动加载外键关联的对象。
以学生对班级为例:
<hibernate-mapping>
    <class name="com.bjpowernode.hibernate.Student" table="t_student">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name"/>
        <many-to-one name="classes" column="classesid"/>
    </class>
</hibernate-mapping>

一对多

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

小结

一对多和多对一映射原理是一样的。在面向对象的思维中二者没有区别。不同的是维护的关系不同。在实体类中通过外键进行维护。
程序映射到数据库关系中是通过映射映射文件中的<set>(通常使用set为了更好的扩展)<one-to-many>和<many-to-one>来进行维护的。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值