前面的文章研究了一对一,多对一,多对一可以搞成外键一对一和多对一,就在于是否设置了unique=”true”
这个外键要搞清楚,不管是一对多,还是多对一,一定都是多的一方添加外键!!!!!!!!!!!!这个很容易想明白,你添加了外键,才可以多嘛
但是配置代码应该写在多对一的主语表里面,如果是多个用户对应一个地址,多就是用户,所以配置代码应该写在用户里面,
前面的一对多也是一样的,一个用户对应多个地址,主语是用户,配置代码应该写在用户里面
其实我们这里 所说的主语,就是主表,这其实是一种约定,主语应该在设计数据库表的时候就应该设定,不应该随意变,设置了主表是用户表,那么所有的配置代码都应该写在用户表里面,一对多,多对一,也都是对于主表而言的
这个东西很容易搞混,如果你不提醒自己那个是主表,那个是从表的话,一个用户对应多个地址,如果你把配置代码写在地址表里面,实际上就是以地址表为主表,反过来念就是多个地址对应一个用户,所以在地址表的配置里面就应该使用多对一的标签,这东西还真是颠来倒去的很容易搞错啊
所以我们一开始就要提醒自己那个是主表,那个是从表,配置代码一律写在主表里面,主语就是主表,不得更改
好了,啰嗦了这么多,我们来看一个用户对应多个地址,代码该怎么写
首先一个用户对应多个地址,在实体代码里面,用户的地址属性就应该更改,原来是一个地址,现在就应该是多个地址,很显然,要用集合或者列表
private Address address; //改成下面这样
private Set<Address> addresses=new HashSet<Address>();
用户表的配置代码是这样
<set name="addresses" table="ADDRESS" inverse="false" lazy="true">
<key>
<column name="USER_ID" />
</key>
<one-to-many class="Address" />
</set>
one-to-many和many-to-one的配置还是大有不同,我们比较一下
<many-to-one name="address" column="address_id" />
虽然在这里user的地址属性在实体类里面是集合类型,但是映射到数据库中是这样的,两张表通过外键USER_ID链接起来
一个用户对应多个地址这种配置方法需要将地址属性转换成集合,
为什么多个用户对应一个地址不需要呢????????