多对多和一对多的映射关系很像,原理上也是相通的。于是,学习这种映射时,还是应该再回忆一下一对多和多对一的映射。
很简单,当出现多对多的映射时,很自然会用到第三张表来维护它们之间的关系。正如人员和职务之间的关系:
![这里写图片描述](https://img-blog.csdn.net/20160218151614598)
<hibernate-mapping>
<class name="com.bjpowernode.hibernate.User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="roles" table="t_user_role">
<key column="user_id"/>
<many-to-many class="com.bjpowernode.hibernate.Role" column="role_id"/>
</set>
</class>
</hibernate-mapping>
多对多关系要生成一张第三方表来维护二者关系,所以这里table="t_user_role"表示生成的第三方表。关于这里的
<key column="user_id"/>
<many-to-many class="com.bjpowernode.hibernate.Role" column="role_id"/>
可以参照之前多对一的关系的理解。相当于两个many-to-one的关系。
1、对于<many-to-one>(用户多对角色一)来说,是在多的一方添加外键。那么key就代表参照的外键,many代表one的类型。唯一不同的是many-to-many中
将key放在了第三方表t_user_role中来维护。
2、而另外一个<many-to-one>(角色多对用户一)来说,也是要生成用户的外键role_id来存入t_user_role来维护。在这里直接用column="role_id"来表示了。
上面展示的是单向的多对多关系,双向的也是一样的。只是在角色方再添加一个对应的关系映射。表的生成并无变化!