Hibernate8-单项多对一映射

其实单向关联用的不是很多,用的最多的是双向关联。

什么是关联映射

在领域模型中,类与类之间的最普遍的关系就是关联关系。
以customer和order为例:一个用户可以有多个订单,而一个订单只能有一个用户,所以这是一对多的关联。

判断单项一对多或多对一

栗子1:还是以customer和order为例,


Hibernate8-1.png

可以看出order对象中的c_id属性存放着customer表中的主键对象,而customer对象中没有一个属性是和order对象有关联的,所以是多对一单项关联(多个订单对应一个用户)。栗子2:


Hibernate8-2.png

如果customer对象存在order对象对象的引用,那么就是一对多。到底是一对多还是多对一要看实际操作。

配置映射

    现在我们有两个映射文件customer和order。我们做的是多对一关联映射,而从我们的业务中可以看出,是多个订单对应一个用户,那么我们就要在order映射文件中写配置。
     配置多对一关联关系需要用到<many-to-one>标签,很好记多到一。我们详细介绍一下这个标签的使用。

<many-to-one name="customer" class="cc.xxx.Customer" column="customer_id"></many-to-one>

    看到上面的一些属性可能觉得很奇怪,我们仔细讲解一下;首先我们确定<many-to-one>标签肯定是写在<class>标签中的,而在<class>标签下的所有标签的name属性值都是映射文件所对应类的属性名吧?例如User类的映射文件中的<property name="userName">标签的name属性对应的就是User对象的userName属性。
    所以<many-to-one>的name属性也一样对应的是Order对象中customer属性名。
    我们Order类对应的是orders表,在Orders表的customer_id字段是外键,记录着customer表中的主键,所以此字段的外键指向那个表的主键,这里的<many-to-one>标签的class属性值就应该是对应表的实体类(包名+类名)。

注意:在orders表的外键,为什么要在orders表的实体类中要写一个类型为Customer的属性呢?
    这是因为Hibernate会根据我们表的外键自动查询出对应表的主键,而Hibernate查询出来的是一个对象,所以这里要写对象类型。
    上面两个属性的意思知道,那么column属性呢?column属性值为orders表中外键的字段名;与name属性意思差不多。

给大家一张图个能更好的理解


Hibernate8-4.png
配图
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容