详解hibernate双向多对多关联映射XML与注解版
发布时间 - 2026-01-11 01:02:03 点击率:次双向多对多关联映射原理:

假设,一个员工可能有多个角色,一个角色可能有多个员工,从员工或角色的角度看,这就是多对多的关系,不管从哪一个角度看,都是多对多的联系。多对多关联映射关系一般采用中间表的形式来实现,即新增一种包含关联双方主键的表。实现多对多关联关系,在数据库底层通过添加中间表指定关联关系,而在hibernate框架在双方的实体中添加一个保存对方的集合,在双方的映射文件中使用<set>元素和<many-to-many>元素进行关联关系的配置。
如下图所示:
(1)XML版
Role类:
package Hibernate_demo1.Demo15.Entity;
import java.util.Set;
public class Role {
private String id;
private String rame;
private Set<User> users;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getRame() {
return rame;
}
public void setRame(String rame) {
this.rame = rame;
}
public Set<User> getUsers() {
return users;
}
public void setUsers(Set<User> users) {
this.users = users;
}
}
User类:
package Hibernate_demo1.Demo15.Entity;
import java.util.Set;
public class User {
private String id;
private String uname;
private Set<Role> roles;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public Set<Role> getRoles() {
return roles;
}
public void setRoles(Set<Role> roles) {
this.roles = roles;
}
}
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="Hibernate_demo1.Demo15.Entity.Role" table="role">
<id name="id" type="java.lang.String">
<column name="id"/>
<generator class="uuid">
</generator>
</id>
<property name="rame" column="rname"/>
<set name="users" table="user_role">
<key column="roleid"></key>
<many-to-many class="Hibernate_demo1.Demo15.Entity.User" column="userid"></many-to-many>
</set>
</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="Hibernate_demo1.Demo15.Entity.User" table="user">
<id name="id">
<generator class="uuid">
</generator>
</id>
<property name="uname" column="uname"/>
<set name="roles" table="user_role">
<key column="userid"/>
<many-to-many class="Hibernate_demo1.Demo15.Entity.Role" column="roleid" />
</set>
</class>
</hibernate-mapping>
测试类:
package Hibernate_demo1.Demo15;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.Session;
import Hibernate_demo1.Demo15.Entity.Role;
import Hibernate_demo1.Demo15.Entity.User;
import Hibernate_demo1.Demo15.Util.HibernateUtils;
public class App
{
public static void main( String[] args )
{
Session session = null;
try{
session = HibernateUtils.getSession();
session.beginTransaction();
Role r1 = new Role();
r1.setRame("数据录入人员");
session.save(r1);
Role r2 = new Role();
r2.setRame("商务主管");
session.save(r2);
Role r3 = new Role();
r3.setRame("商务经理");
session.save(r3);
Role r4 = new Role();
r4.setRame("项目会计");
session.save(r4);
User u1 = new User();
u1.setUname("张三");
Set<Role> u1Roles = new HashSet<Role>();
u1Roles.add(r1);
u1Roles.add(r2);
u1.setRoles(u1Roles);
session.save(u1);
User u2 = new User();
u2.setUname("李四");
Set<Role> u2Roles = new HashSet<Role>();
u2Roles.add(r1);
u2Roles.add(r2);
u2Roles.add(r3);
u2.setRoles(u2Roles);
session.save(u2);
User u3 = new User();
u3.setUname("王五");
Set<Role> u3Roles = new HashSet<Role>();
u3Roles.add(r3);
u3Roles.add(r4);
u3.setRoles(u3Roles);
session.save(u3);
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
}
执行结果:
Hibernate:
insert
into
role
(rname, id)
values
(?, ?)
Hibernate:
insert
into
role
(rname, id)
values
(?, ?)
Hibernate:
insert
into
role
(rname, id)
values
(?, ?)
Hibernate:
insert
into
role
(rname, id)
values
(?, ?)
Hibernate:
insert
into
user
(uname, id)
values
(?, ?)
Hibernate:
insert
into
user
(uname, id)
values
(?, ?)
Hibernate:
insert
into
user
(uname, id)
values
(?, ?)
Hibernate:
insert
into
user_role
(userid, roleid)
values
(?, ?)
Hibernate:
insert
into
user_role
(userid, roleid)
values
(?, ?)
Hibernate:
insert
into
user_role
(userid, roleid)
values
(?, ?)
Hibernate:
insert
into
user_role
(userid, roleid)
values
(?, ?)
Hibernate:
insert
into
user_role
(userid, roleid)
values
(?, ?)
Hibernate:
insert
into
user_role
(userid, roleid)
values
(?, ?)
Hibernate:
insert
into
user_role
(userid, roleid)
values
(?, ?)
数据库内容为:
user表:
role表:
user_role表:
(2)注解版
Role类:
package Hibernate_demo1.Demo16.Entity;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
@Entity
@Table(name="role")
public class Role {
@Id
@GenericGenerator(name="uuidGenerator", strategy="uuid")
@GeneratedValue(generator="uuidGenerator")
private String id;
@Column(name="rname")
private String rame;
@ManyToMany(cascade=CascadeType.REFRESH,mappedBy="roles")
private Set<User> users=new HashSet<User>();
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getRame() {
return rame;
}
public void setRame(String rame) {
this.rame = rame;
}
public Set<User> getUsers() {
return users;
}
public void setUsers(Set<User> users) {
this.users = users;
}
}
User类:
package Hibernate_demo1.Demo16.Entity;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import javax.persistence.JoinColumn;
import org.hibernate.annotations.GenericGenerator;
@Entity
@Table(name="user")
public class User {
@Id
@GenericGenerator(name="uuidGenerator", strategy="uuid")
@GeneratedValue(generator="uuidGenerator")
private String id;
@Column(name="uname")
private String uname;
/*
* @ManyToMany表示多对多关联,对于这种关联极少数情况会使用级联删除,我这里设置的是级联刷新;
* 因为有中间表的存在这里使用@JoinTable来设置关联表后面的name配置的是关联表的名称
* inverseJoinColumn配置的是关系被维护一方主键对应的中间表字段
* joinColumn配置的是关系维护方主键对应的中间表字段。
*/
@ManyToMany(cascade=CascadeType.REFRESH)
@JoinTable(name="user_role",inverseJoinColumns=@JoinColumn(name="roleid"),joinColumns=@JoinColumn(name="userid"))
private Set<Role> roles=new HashSet<Role>();
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public Set<Role> getRoles() {
return roles;
}
public void setRoles(Set<Role> roles) {
this.roles = roles;
}
}
测试类:
package Hibernate_demo1.Demo16;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import Hibernate_demo1.Demo16.Entity.Role;
import Hibernate_demo1.Demo16.Entity.User;
public class Test {
public static void main(String[] args) {
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.getCurrentSession();
Transaction tx = session.beginTransaction();
//创建两个用户
User us1=new User();
us1.setUname("小明");
User us2=new User();
us2.setUname("小黑");
//创建用户集合
Set<User> su=new HashSet<User>();
su.add(us1);
su.add(us2);
//创建两个角色
Role ro1=new Role();
ro1.setRame("程序员");
ro1.setUsers(su);
Role ro2=new Role();
ro2.setRame("技术经理");
ro2.setUsers(su);
//创建角色集合
Set<Role> sr=new HashSet<Role>();
sr.add(ro1);
sr.add(ro2);
//往用户添加角色集合
us1.setRoles(sr);
us2.setRoles(sr);
//保存用户和角色
session.save(us1);
session.save(us2);
session.save(ro1);
session.save(ro2);
tx.commit();
session.close();
}
}
执行结果如下:
Hibernate:
insert
into
user
(uname, id)
values
(?, ?)
Hibernate:
insert
into
user
(uname, id)
values
(?, ?)
Hibernate:
insert
into
role
(rname, id)
values
(?, ?)
Hibernate:
insert
into
role
(rname, id)
values
(?, ?)
Hibernate:
insert
into
user_role
(userid, roleid)
values
(?, ?)
Hibernate:
insert
into
user_role
(userid, roleid)
values
(?, ?)
Hibernate:
insert
into
user_role
(userid, roleid)
values
(?, ?)
Hibernate:
insert
into
user_role
(userid, roleid)
values
(?, ?)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# hibernate
# 注解映射
# hibernate关系映射
# 映射
# xml
# Hibernate双向多对多映射关系配置代码实例
# Java的Hibernate框架中一对多的单向和双向关联映射
# Java的Hibernate框架中的双向主键关联与双向外键关联
# Hibernate一对多关联双向关联代码实现分享
# Hibernate组件映射代码详解
# Hibernate映射文件id的generator配置方法
# Hibernate使用hbm.xml配置映射关系解析
# 快速了解hibernate配置文件与映射文件
# Hibernate双向一对一映射关系配置代码实例
# 的是
# 多个
# 主键
# 能有
# 关联关系
# 角度看
# 都是
# 级联
# 这就是
# 而在
# 所示
# 来实现
# 小明
# 大家多多
# 为有
# 如下图
# 李四
# 王五
# 数据录入
# roles
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何用免费手机建站系统零基础打造专业网站?
MySQL查询结果复制到新表的方法(更新、插入)
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧
Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
EditPlus中的正则表达式 实战(1)
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
实例解析angularjs的filter过滤器
Laravel怎么为数据库表字段添加索引以优化查询
Laravel路由怎么定义_Laravel核心路由系统完全入门指南
如何在宝塔面板中创建新站点?
Windows10如何更改计算机工作组_Win10系统属性修改Workgroup
Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程
高防服务器租用如何选择配置与防御等级?
jQuery validate插件功能与用法详解
如何利用DOS批处理实现定时关机操作详解
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
javascript基本数据类型及类型检测常用方法小结
如何选择PHP开源工具快速搭建网站?
如何用低价快速搭建高质量网站?
Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】
php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】
C++时间戳转换成日期时间的步骤和示例代码
如何在阿里云域名上完成建站全流程?
Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】
清除minerd进程的简单方法
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
如何快速完成中国万网建站详细流程?
如何在建站之星绑定自定义域名?
原生JS获取元素集合的子元素宽度实例
Laravel如何处理CORS跨域请求?(配置示例)
C++用Dijkstra(迪杰斯特拉)算法求最短路径
如何用好域名打造高点击率的自主建站?
Laravel如何操作JSON类型的数据库字段?(Eloquent示例)
企业网站制作这些问题要关注
HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
如何自定义建站之星网站的导航菜单样式?
专业商城网站制作公司有哪些,pi商城官网是哪个?
如何在IIS7中新建站点?详细步骤解析
Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门
如何快速生成ASP一键建站模板并优化安全性?
Laravel如何生成和使用数据填充?(Seeder和Factory示例)
Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧
Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】
Laravel如何为API生成Swagger或OpenAPI文档
ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法

