Hibernate 关系映射之多对多关联
现实中的对象之前的关系大多是多对多的关系,因为一对一,多对一,一对多的关系都可以归结到多对多关系的一种特殊情况。
多对多关系实现的方式:
新建一张中间表,2个字段外键关联对应2张表的id,用2个多对一的关系实现多对多关联。
一、多对多单向关联
场景:以用户(User)和角色(Role)关系为例 。
一个用户对应多种角色,一种角色对应多个用户。
- 对象关联
实体类User
public class User { private int id; private String name; private Set<Role> roles; public int getId() {return id;} public void setId(int id) {this.id = id;} public String getName() {return name;} public void setName(Stringname) {this.name = name;} public Set<Role> getRoles() {return roles;} public void setRoles(Set<Role> roles) {this.roles = roles;} }
实体类Role
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(Stringname) { this.name = name;} }
- 关系模型
- 关联映射
1.xml方式
在 一方添加<set>标签 映射多对多(映射set集合),name=集合对象,然后在用<key>标签定义外键。<many-to-many>标签设置映射的类实体
<!--Role.hbm.xml--> <class name="com.yk.hibernate.Role" table="role"> <id name="id"> <generator class="native"/> </id> <property name="name" column="name"/> </class> <!--User.hbm.xml--> </span><class name="com.yk.hibernate.User" table="user"> <id name="id"> <generator class="native"/> </id> <property name="name" column="name"/> <set name="users" table="user_role"order-by="userId"></span> <key column="role_id"/> <many-to-many class="com.yk.hibernate.User" column="user_id"/> </set> </class>
2.annotation方式
在一方类 的“多(set<E>)”对象getter方法上添加注解@ManyToMany 注解,并使用@JoinTabel来注解第三方表的名称,再使用joinColumns属性来指定当前对象User在中间表中的字段名, 再用inverseJoinColumns来指定当前类持有引用的实体对象Role在中间表的字段名,并且指向被引用对象相对应的表,如下:
@ManyToMany @JoinTable(name="user_role", joinColumns={@JoinColumn(name="user_id")}, inverseJoinColumns={@JoinColumn(name="role_id")} ) public Set<User> getRoles() {return roles;}
二、多对多双向关联
场景:以上述场景为例
- 对象模型:同上
- 关系模型:同上
- 关联映射
1.xml方式:
在单向关联的基础上,在另一个映射文件建立同样的many-to-many标签
<!--User.hbm.xml--> <class name="com.yk.hibernate.User" table="user"> <id name="id"> <generator class="native"/> </id> <property name="name" column="name"/> <set name="users" table="user_role"order-by="userId"> <key column="role_id"/> <many-to-many class="com.yk.hibernate.User" column="user_id"/> </set> </class>
2.annotation方式
多对多关联映射 双向 两方都持有对象引用,修改对象模型,但数据的存储没有变化
只需要修改注解映射就可以了。
在单向关联的基础上,另一个类的Set<E>对象上加上注释mappedBy
User.java
@ManyToMany @JoinTable(name="user_role", joinColumns={@JoinColumn(name="user_id")}, inverseJoinColumns={@JoinColumn(name="role_id")} ) public Set<User> getRoles() {return roles;}
Role.java
@ManyToMany(mappedBy="roles") public Set<User>getUsers() {return users;}
相关推荐
包含《多对多双向关联映射》《多对一单向关联映射》《多对一双向关联映射》《一对多单向关联映射》等文档,并有图解及例子,非常适合新手学习,尤其是刚刚接触hibernate,对映射关系不清楚的。。。。
Hibernate 多对一外键单向关联 Hibernate 多对一连接表单向关联 Hibernate 多对多单向关联 Hibernate 一对一外键双向关联 Hibernate 一对一主键双向关联 Hibernate 一对一连接表双向关联 Hibernate 一对多外键双向...
Hibernate映射一对多关联关系
该资源包含了一些常用的hibernate关联映射实例。包括一对多,多对多,继承映射,等,是学习hibernate的必备品
hibernate关联映射详解SSH 多对多,一对多关系对象映射
Hibernate 关联关系映射分类
Hibernate关联关系映射 单向关联 │ ├─ 一对一外键单向关联 │ ├─ 一对一主键单向关联 │ ├─ 一对一连接表单向关联 │ ├─ 一对多外键单向关联 │ ├─ 一对多连接表单向关联 │ ├─ 多对一外键单向关联 │ ...
关于对Hibernate关联映射的一个总结,其中有各种映射的例子,详细用法 等
Hibernate4中映射关系图解。
NULL 博文链接:https://1028826685.iteye.com/blog/1536060
Hibernate_关联关系映射配置详解,希望能帮助广大java爱好者
1:Hibernate的关联映射,存在一对多和多对一映射,多对多映射: 1.1:一对多和多对一映射,举例说明: 学生和老师: 一个老师可以教多个学生 【一对多映射】 多个学生可以被一个老师教【多对一映射】 部门与员工: ...
hibernate的关联关系映射,所有描述以选课系统这个案例来说明
hibernate里关联关系映射,各种关系解析,帮助大家搞清楚hibernate的关系映射
student与Score的Map集合关系 student与class的多对一 一对多映射
Hibernate_关联关系映射配置
文件中包含关于hibernate 各个属性的解释
hibernate双向多对多关联映射(注解版)
Hibernate关联关系映射.CHM Hibernate文档相关
Hibernate实体关联关系映射--学习总结,让同仁们更好的学习Hiebernate