第一步首先设计数据库表, 我分别设计的是: 用户表. 角色表 . 关系表
第二步设计实体类:在用户表里面添加一个Set集合代码如下:
![](https://img-blog.csdn.net/20171107213519157?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzk0Njk4MDk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
User.hbm.xml
文件中要使用<many-to-many>标签,并且在标签中添加上对应的列关系,因为你要让两个对象中都要清楚它们之间的映射是如何使用的,并且在生成的关系表中哪一列是对应的自己的外键,所以要在该标签中指明,另外在<set>标签中添加table属性会指明要生成新表,下面的示例中添加了u_r,所以会生成新的关联表。
- <?xml version="1.0"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <class name="com.src.hibernate.User" table="t_user">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="uname"/>
- <set name="roles" table="u_r">
- <key column="uid"></key>
- <many-to-many class="com.src.hibernate.Role" column="rid"></many-to-many>
- </set>
- </class>
- </hibernate-mapping>
-
在角色表里面添加一个Set集合代码如下:
![](https://img-blog.csdn.net/20171107214130785?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzk0Njk4MDk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
Roles.hbm.xml
因为是单向的关系,所以在该映射文件中就不需要添加多余的标签来维护关系了,它的内部代码也会很简单,对应的映射代码如下:
![](https://img-blog.csdn.net/20171107214219513?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzk0Njk4MDk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
第三步配置Hibernade.cfg.xml文件
![](https://img-blog.csdn.net/20171107214556140?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzk0Njk4MDk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
因为是单向的关系,所以在该映射文件中就不需要添加多余的标签来维护关系了,它的内部代码也会很简单,对应的映射代码如下:
- <?xml version="1.0"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <class name="com.src.hibernate.Role" table="t_role">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name"/>
- </class>
- </hibernate-mapping>
第四步在创建一个page包,一个class测试类里面写测试类内容,我的测试类名是:TestManyToMany
![](https://img-blog.csdn.net/20171107214837652?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzk0Njk4MDk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20171107215006780?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzk0Njk4MDk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
用户表运行结果如下:
![](https://img-blog.csdn.net/20171107215359770?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzk0Njk4MDk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
角色表运行结果如下:
关系表运行结果如下:
![](https://img-blog.csdn.net/20171107215447395?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzk0Njk4MDk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
二、双向多对多
双向的多对多映射可以看做是单向的一种扩展,它其实是为了设置在两端同时维护关系,从任何一端都能够加载到另一端的内容,在实现上和单向的起始端是相同的都要使用<many-to-many>标签。
同样以上面的User和Role来做示例,上面的示例中使用了单向的多对多,不同的是这里要使用双向关系,所以要在Role的一端添加同样的映射关系,并在相应的对象中添加集合映射,其中对应的User内的代码不会发生改变。
Roles.hbm.xml
因为是双向的多对多所以要在对象的两端同时加入双向的集合映射,也就是在配置文件中添加<set>标签,并在标签中添加<many-to-many>标签,具体的配置方法类似于上文的User.hbm.xml的配置方法,如下:
- <?xml version="1.0"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <class name="com.src.hibernate.Role" table="t_role">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name"/>
-
-
- <set name="users" table="u_r">
- <key column="rid"/>
-
- <many-to-many class="com.src.hibernate.User" column="uid"></many-to-many>
- </set>
- </class>
- </hibernate-mapping>
2.2 Roles.java
同单向的多对多关系中的文件相同,不过需要在对象中添加集合映射Set,使用set来标明映射的集合,如下代码:
- package com.src.hibernate;
-
- import java.util.Set;
-
- public class Roles {
-
- private int rid;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
-
-
- private String name;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
-
-
- private Set users;
- public Set getUsers() {
- return users;
- }
- public void setUsers(Set users) {
- this.users = users;
- }
-
- }
双向关联映射是在单向的关联映射基础上配置而来的,只需要在映射文件的两端同时配置<many-to-many>即可,也就是说Users.hbm.xml和Users.java代码和上文中的代码相同,不发生变化,所以不再重复添加了。
结语:
完整的单向多对多讨论完整,需要注意的主要是users.hbm.xml中配置的方法,需要使用<many-to-many>标签并且需要生成关系表来维护多对多的关系,其它的内容都是很简单的。