其实单向关联用的不是很多,用的最多的是双向关联。
什么是关联映射
在领域模型中,类与类之间的最普遍的关系就是关联关系。
以customer和order为例:一个用户可以有多个订单,而一个订单只能有一个用户,所以这是一对多的关联。
判断单项一对多或多对一
栗子1:还是以customer和order为例,
可以看出order对象中的c_id属性存放着customer表中的主键对象,而customer对象中没有一个属性是和order对象有关联的,所以是多对一单项关联(多个订单对应一个用户)。栗子2:
如果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属性意思差不多。
给大家一张图个能更好的理解