双向多对多关联映射原理:
假设,一个员工可能有多个角色,一个角色可能有多个员工,从员工或角色的角度看,这就是多对多的关系,不管从哪一个角度看,都是多对多的联系。多对多关联映射关系一般采用中间表的形式来实现,即新增一种包含关联双方主键的表。实现多对多关联关系,在数据库底层通过添加中间表指定关联关系,而在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 (?, ?)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
1. 前言 通过本节课程的学习,你将发现关联对象之间的微妙关系。相信这种关系对你更深入地认识 HIbernate 有很大的帮助。 通过本节课程,你将了解到: 多对多双向关联映射中哪一方是关系维系者; 级联操作与关系维系者。 2. 关系维系者 新学期开始了,同学们选择了各自喜欢的课程,现在为学生添加选修课程的任务就要落在 Hibernate 的身上。一起来看看 Hibernate 是如何完成这个任务
1. 前言 本节课程和大家一起聊聊一对多关联映射。通过本节课程,你将了解到: 如何实现一对多关联映射; 如何实现双向一对多关联映射; 关联映射中的级联操作。 2. 一对多关联映射 关系型数据库中表与表中的数据存在一对多(或多对一)关系。 如学生表、班级表。一个班级有多个学生,多个学生可以在同一个班级。 一对多或多对一本质上是一样的,如同一块硬币的正面和反面,只是看待事物的角度不同而已。 数据库中有
1. 前言 本节课,咱们一起继续聊聊多对多关联映射。通过本节课程,你将了解到: 多对多关联映射的实现; 双向多对多关联映射的实现。 2. 多对多关联映射 首先了解表中的多对多关系,学生表中的数据和课程表中的数据就存在多对多关系。 一名学生可以选修多门课程,一门课程可以供多名学生选修。 数据库通过主外键的机制描述表中的数据之间的关系。对于存在多对多关系的数据表,借助于中间表,分拆成两个一对多(或者多
我的实体如下所示: 我的问题是: 为什么会这样,即使在我添加食谱和房子之间的联系之前没有发生? 我怎样才能修好它? 原因是什么?
问题内容: 我正在努力进行双向多对多映射,其中顺序在一侧很重要,而在另一侧则不重要。 我有两节课:程序和学生。 一个程序有很多学生,顺序很重要。 程序A 约翰 莎莉 赛斯 程式B 亚历克斯 赛斯 艾米 约翰 一个学生有很多程序,但是顺序在这里并不重要。 John 程序A 程序B 莎莉 程序A 赛斯 程序A 程式B 亚历克斯 程式B 艾米 程式B 因此,似乎我可以在程序和学生之间建立双向的多对多关联
本文向大家介绍hibernate一对多关联映射学习小结,包括了hibernate一对多关联映射学习小结的使用技巧和注意事项,需要的朋友参考一下 一对多关联映射 映射原理 一对多关联映射和多对一关联映射的映射原理是一致的,都是在多的一端加入一个外键,指向一的一端。关联关系都是由多端维护,只是在写映射时发生了变化。 多对一和一对多的区别 多对一和一对多的区别在于维护的关系不同: