【回顾】
上篇博客学习的是一对多单向与双向关联映射,到目前为止,就还剩下多对多关联映射没有提到。所以本篇博客内容为多对多关联映射。
【多对多】
1. 实例:用户与角色的关系。多个用户可以拥有多个角色。
2. 实体类:
User实体:
package com.bjpowernode.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;
}
}
role实体:
package com.bjpowernode.hibernate;
public class Role {
private int id;
private String name;
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;
}
}
3. 配置文件映射:
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>
<class name="com.bjpowernode.hibernate.Role" table="t_role">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
</hibernate-mapping>
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.bjpowernode.hibernate.User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<!-- set标签维护角色,添加中间表t_user_role,字段包括两个表的主键 -->
<set name="roles" table="t_user_role">
<!-- 增加列user_id -->
<key column="user_id"/>
<!-- 多对多关系映射,指明role实体类来源,增加列role_id -->
<many-to-many class="com.bjpowernode.hibernate.Role" column="role_id" />
</set>
</class>
</hibernate-mapping>
上述方法同样是单向关联映射,只是在User端引用了Roles,下面就看看如何改写成双向关联映射。
【多对多双向关联】
1. 实体类代码:
在role角色类中引用User类:
package com.bjpowernode.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;
}
}
2. 配置映射文件:
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>
<class name="com.bjpowernode.hibernate.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"/>
<!-- 在role中引入User,标明来源,和另一个字段名 -->
<many-to-many class="com.bjpowernode.hibernate.User" column="user_id"/>
</set>
</class>
</hibernate-mapping>
【总结】
本篇博客介绍的是多对多的关系映射,其原理是生成一张中间表,将两个表的主键都加入到中间表中。而对于多对多的双向映射,则需要注意的是,两个映射文件中的表名和字段名配置必须保持一致。
至此,Hibernate系列中所有关系的关联映射就总结完了。不知道对于第一篇博客中提到的问题大家是否有了新的答案?
准确地来说,Hibernate关联映射实体间的关系应该是包含七种,分别是:
对于Hibernate关联映射的学习和这些系列博客的总结,至少是比没有总结要好。但总结完后,还缺少实践,所以感觉挺混乱的。不过,如果接触的项目运用了这样的Hibernate配置,我觉得只要具体问题具体分析,理清各实体间的关系,利用对应的标签进行配置并不会很难,只是现在还不熟练的问题。1. 多对一关联映射2. 一对一单向关联映射、一对一双向关联映射3. 一对多单向关联映射、一对多双向关联映射4. 多对多单向关联映射、多对多双向关联映射。