many-to-many是多对多的映射关系,如用户和角色。一个用户可能有多个角色,一个角色可能有多个用户。
多对多是用一个中间连接表边实现的,每一端的设置是一样的,对称的。
单向和双向的配制没有什么区别。
package com.iteedu.hibernate; import java.util.Set; public class Role { private int id; private String name; private Set users; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set getUsers() { return users; } public void setUsers(Set users) { this.users = users; } }
<?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.iteedu.hibernate.Role" table="t_role"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="users" table="t_user_role" order-by="userid"> <key column="roleid"/> <many-to-many class="com.iteedu.hibernate.User" column="userid"/> </set> </class> </hibernate-mapping>
说明:
用户表关联t_user_role,角色表关联t_user_role,这样来实现多对多关联。
package com.iteedu.hibernate; import java.util.Set; public class User { private int id; private String name; private Set roles; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set getRoles() { return roles; } public void setRoles(Set roles) { this.roles = roles; } }
<?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.iteedu.hibernate.User" table="t_user"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="roles" table="t_user_role"> <key column="userid"/> <many-to-many class="com.iteedu.hibernate.Role" column="roleid"/> </set> </class> </hibernate-mapping>
配制和角色一样。
session.beginTransaction(); Role r1 = new Role(); r1.setName("role1"); session.save(r1); Role r2 = new Role(); r2.setName("role2"); session.save(r2); Role r3 = new Role(); r3.setName("role3"); session.save(r3); User u1 = new User(); u1.setName("QQ"); Set u1Roles = new HashSet(); u1Roles.add(r1); u1Roles.add(r2); u1.setRoles(u1Roles); User u2 = new User(); u2.setName("130"); Set u2Roles = new HashSet(); u2Roles.add(r2); u2Roles.add(r3); u2.setRoles(u2Roles); User u3 = new User(); u3.setName("BAIDU"); Set u3Roles = new HashSet(); u3Roles.add(r1); u3Roles.add(r2); u3Roles.add(r3); u3.setRoles(u3Roles); session.save(u1); session.save(u2); session.save(u3); session.getTransaction().commit();