【SSH进阶之路】Hibernate映射——多对多关联映射(八)
2015-11-17 20:53
363 查看
多对多映射是现实生活中最常见的映射,也是最容易理解的映射。废话少说,直接开始。
不论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张做一个关联。用第三张表来解决可能会造成数据冗余的问题。
一个用户(User)对多个角色(Role),一个角色对多个用户。
对象模型
关系模型
实例
下面我们看一下实体类和映射文件的代码。
User
[java] view
plaincopyprint?
package com.liang.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 Set getRoles() {
return roles;
}
public void setRoles(Set roles) {
this.roles = roles;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Role
[java] view
plaincopyprint?
package com.liang.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;
}
}
User.hbm.xml
[html] view
plaincopyprint?
<?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.liang.hibernate">
<class name="User" table="t_user">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<!-- roles属性,表达的是本对象(User)与Role的多对多的关系 -->
<set name="roles" table="t_user_role">
<!--当前表(User)的主键-->
<key column="user_id"></key>
<many-to-many class="Role" column="role_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
Role.hbm.xml
[html] view
plaincopyprint?
<?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.liang.hibernate">
<class name="Role" table="t_role">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
</class>
</hibernate-mapping>
生成的表结构和测试数据
多对多关联映射,在实体类中,跟一对多关联映射一样,也是用集合来表示的。<set>标签中用table属性重命名中间表名称,<key>标签定义当前表的主键,用<many-to-many>标签来关联另一张表。
对象模型
关系模型
同上
实例
下面我们看一下实体类和映射文件的代码。
User
[html] view
plaincopyprint?
package com.liang.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 Set getRoles() {
return roles;
}
public void setRoles(Set roles) {
this.roles = roles;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Role
[java] view
plaincopyprint?
package com.liang.hibernate;
import java.util.Set;
public class Role {
private int id;
private String name;
private Set users;
public Set getUsers() {
return users;
}
public void setUsers(Set users) {
this.users = 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;
}
}
User.hbm.xml
[html] view
plaincopyprint?
<?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.liang.hibernate">
<class name="User" table="t_user">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<!-- roles属性,表达的是本对象(User)与Role的多对多的关系 -->
<set name="roles" table="t_user_role">
<!--当前表(User)的主键-->
<key column="user_id"></key>
<many-to-many class="Role" column="role_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
Role.hbm.xml
[html] view
plaincopyprint?
<?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.liang.hibernate">
<class name="Role" table="t_role">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<!-- users属性,表达的是本对象(Role)与User的多对多的关系 -->
<set name="users" table="t_user_role">
<!--当前表(Role)的主键-->
<key column="role_id"></key>
<many-to-many class="User" column="user_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
生成的表结构和测试数据
多对多双向关系中,User和Role的映射文件相同,值得注意的是生成的中间表名称必须一样,生成中间表的字段必须一样。
多对多关联映射到此就结束了,经过对一对多关联映射的学习,相对而言,多对多关联映射变得非常的简单了,非常像一对多关联映射的变体。
Hibernate的总结篇马上杀到,谢谢关注。
映射原理
不论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张做一个关联。用第三张表来解决可能会造成数据冗余的问题。
举例
一个用户(User)对多个角色(Role),一个角色对多个用户。
分类
单向的多对多关联映射(单向User--->Role)
对象模型
关系模型
实例
下面我们看一下实体类和映射文件的代码。
User
[java] view
plaincopyprint?
package com.liang.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 Set getRoles() {
return roles;
}
public void setRoles(Set roles) {
this.roles = roles;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Role
[java] view
plaincopyprint?
package com.liang.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;
}
}
User.hbm.xml
[html] view
plaincopyprint?
<?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.liang.hibernate">
<class name="User" table="t_user">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<!-- roles属性,表达的是本对象(User)与Role的多对多的关系 -->
<set name="roles" table="t_user_role">
<!--当前表(User)的主键-->
<key column="user_id"></key>
<many-to-many class="Role" column="role_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
Role.hbm.xml
[html] view
plaincopyprint?
<?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.liang.hibernate">
<class name="Role" table="t_role">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
</class>
</hibernate-mapping>
生成的表结构和测试数据
多对多关联映射,在实体类中,跟一对多关联映射一样,也是用集合来表示的。<set>标签中用table属性重命名中间表名称,<key>标签定义当前表的主键,用<many-to-many>标签来关联另一张表。
双向的多对多关联映射(双向User<--->Role)
对象模型
关系模型
同上
实例
下面我们看一下实体类和映射文件的代码。
User
[html] view
plaincopyprint?
package com.liang.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 Set getRoles() {
return roles;
}
public void setRoles(Set roles) {
this.roles = roles;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Role
[java] view
plaincopyprint?
package com.liang.hibernate;
import java.util.Set;
public class Role {
private int id;
private String name;
private Set users;
public Set getUsers() {
return users;
}
public void setUsers(Set users) {
this.users = 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;
}
}
User.hbm.xml
[html] view
plaincopyprint?
<?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.liang.hibernate">
<class name="User" table="t_user">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<!-- roles属性,表达的是本对象(User)与Role的多对多的关系 -->
<set name="roles" table="t_user_role">
<!--当前表(User)的主键-->
<key column="user_id"></key>
<many-to-many class="Role" column="role_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
Role.hbm.xml
[html] view
plaincopyprint?
<?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.liang.hibernate">
<class name="Role" table="t_role">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<!-- users属性,表达的是本对象(Role)与User的多对多的关系 -->
<set name="users" table="t_user_role">
<!--当前表(Role)的主键-->
<key column="role_id"></key>
<many-to-many class="User" column="user_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
生成的表结构和测试数据
多对多双向关系中,User和Role的映射文件相同,值得注意的是生成的中间表名称必须一样,生成中间表的字段必须一样。
总结
多对多关联映射到此就结束了,经过对一对多关联映射的学习,相对而言,多对多关联映射变得非常的简单了,非常像一对多关联映射的变体。
Hibernate的总结篇马上杀到,谢谢关注。
相关文章推荐
- 数值的整数次方
- 程序员必读书单
- web前端性能监控
- NSNotification、delegate和KVO的区别
- Kettle 连接失败 Oracle 数据库报 ora-12505 的解决方法
- TCP/IP详解之:Ping程序、Traceroute程序
- cf#238
- hadoop 入门 -- 图片都没了,晕,后面再补上试试
- 关于函数的参数传递
- 改善Java程序的151个建议--记录二(持续更新)
- Java内部类
- 第一个Sprint冲刺第七天
- 镜像与发布订阅的搭配使用
- 【SSH进阶之路】Hibernate映射——一对一双向关联映射(六)
- 二进制中1的个数
- python 小练习之冒泡排序
- Ubuntu 14.04 安装wine QQ方法
- poj 3126.Prime Path(bfs)
- mysql的一些基本知识
- pm2