多对多在实际开发中会用到,比如:User用户和Role角色就是多对多的关系。
类图:
映射的数据库表:
User.java:
public class User { private Integer id; private String name; private Set<Role> roles; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<Role> getRoles() { return roles; } public void setRoles(Set<Role> roles) { this.roles = roles; } }
注:因为多对多双向关联映射,所以在User中要有Role的引用,在Role中要有User的属性。
Role.java:
public class Role { private Integer id; private String name; private Set<User> users; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<User> getUsers() { return users; } public void setUsers(Set<User> users) { this.users = users; } }
注:因为多对多双向关联映射,所以在Role中要有User的属性,在User中要有Role的引用。
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 package="com.lixue.bean"> <class name="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" not-null="true" /> <many-to-many class="Role" column="role_id" /> </set> </class> </hibernate-mapping>
注:多对多是靠关联表来实现的,两个映射文件中关联表的名称要一致,关联表中的字段要一致。
Role.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 package="com.lixue.bean"> <class name="Role" table="t_role"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <!-- 关联表的名称要一致 --> <set name="users" table="t_user_role"> <key column="role_id" not-null="true"/> <many-to-many class="User" column="user_id"/> </set> </class> </hibernate-mapping>
注:多对多是靠关联表来实现的,两个映射文件中关联表的名称要一致,关联表中的字段要一致。
测试方法:
public void testSave(){ /*定义session和事物*/ Session session = null; Transaction transaction = null; try { session = HibernateUtils.getSession(); transaction = session.beginTransaction(); /*创建角色1*/ Role r1 = new Role(); r1.setName("网管"); /*创建角色2*/ Role r2 = new Role(); r2.setName("老板"); /*创建set集合并存储角色*/ Set<Role> roles = new HashSet<Role>(); roles.add(r1); roles.add(r2); /*创建用户1*/ User u1 = new User(); u1.setName("小廖"); /*创建用户2*/ User u2 = new User(); u2.setName("小廖"); /*创建set集合并存储用户*/ Set<User> users = new HashSet<User>(); users.add(u1); users.add(u2); /*为user分配角色*/ u1.setRoles(roles); u2.setRoles(roles); /*保存*/ session.save(r1); session.save(r2); session.save(u1); session.save(u2); /*提交事物*/ transaction.commit(); } catch (Exception e) { e.printStackTrace(); transaction.rollback(); } finally { HibernateUtils.closeSession(session); } }