詳解hibernate雙向多對(duì)多關(guān)聯(lián)映射XML與注解版
雙向多對(duì)多關(guān)聯(lián)映射原理:
假設(shè),一個(gè)員工可能有多個(gè)角色,一個(gè)角色可能有多個(gè)員工,從員工或角色的角度看,這就是多對(duì)多的關(guān)系,不管從哪一個(gè)角度看,都是多對(duì)多的聯(lián)系。多對(duì)多關(guān)聯(lián)映射關(guān)系一般采用中間表的形式來(lái)實(shí)現(xiàn),即新增一種包含關(guān)聯(lián)雙方主鍵的表。實(shí)現(xiàn)多對(duì)多關(guān)聯(lián)關(guān)系,在數(shù)據(jù)庫(kù)底層通過(guò)添加中間表指定關(guān)聯(lián)關(guān)系,而在hibernate框架在雙方的實(shí)體中添加一個(gè)保存對(duì)方的集合,在雙方的映射文件中使用<set>元素和<many-to-many>元素進(jìn)行關(guān)聯(lián)關(guān)系的配置。
如下圖所示:

(1)XML版
Role類(lèi):
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類(lèi):
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映射類(lèi):
<?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映射類(lèi):
<?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>
測(cè)試類(lèi):
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("數(shù)據(jù)錄入人員");
session.save(r1);
Role r2 = new Role();
r2.setRame("商務(wù)主管");
session.save(r2);
Role r3 = new Role();
r3.setRame("商務(wù)經(jīng)理");
session.save(r3);
Role r4 = new Role();
r4.setRame("項(xiàng)目會(huì)計(jì)");
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);
}
}
}
執(zhí)行結(jié)果:
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
(?, ?)
數(shù)據(jù)庫(kù)內(nèi)容為:
user表:

role表:

user_role表:

(2)注解版
Role類(lèi):
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類(lèi):
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表示多對(duì)多關(guān)聯(lián),對(duì)于這種關(guān)聯(lián)極少數(shù)情況會(huì)使用級(jí)聯(lián)刪除,我這里設(shè)置的是級(jí)聯(lián)刷新;
* 因?yàn)橛兄虚g表的存在這里使用@JoinTable來(lái)設(shè)置關(guān)聯(lián)表后面的name配置的是關(guān)聯(lián)表的名稱(chēng)
* inverseJoinColumn配置的是關(guān)系被維護(hù)一方主鍵對(duì)應(yīng)的中間表字段
* joinColumn配置的是關(guān)系維護(hù)方主鍵對(duì)應(yīng)的中間表字段。
*/
@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;
}
}
測(cè)試類(lèi):
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();
//創(chuàng)建兩個(gè)用戶(hù)
User us1=new User();
us1.setUname("小明");
User us2=new User();
us2.setUname("小黑");
//創(chuàng)建用戶(hù)集合
Set<User> su=new HashSet<User>();
su.add(us1);
su.add(us2);
//創(chuàng)建兩個(gè)角色
Role ro1=new Role();
ro1.setRame("程序員");
ro1.setUsers(su);
Role ro2=new Role();
ro2.setRame("技術(shù)經(jīng)理");
ro2.setUsers(su);
//創(chuàng)建角色集合
Set<Role> sr=new HashSet<Role>();
sr.add(ro1);
sr.add(ro2);
//往用戶(hù)添加角色集合
us1.setRoles(sr);
us2.setRoles(sr);
//保存用戶(hù)和角色
session.save(us1);
session.save(us2);
session.save(ro1);
session.save(ro2);
tx.commit();
session.close();
}
}
執(zhí)行結(jié)果如下:
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
(?, ?)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Hibernate雙向多對(duì)多映射關(guān)系配置代碼實(shí)例
- Java的Hibernate框架中一對(duì)多的單向和雙向關(guān)聯(lián)映射
- Java的Hibernate框架中的雙向主鍵關(guān)聯(lián)與雙向外鍵關(guān)聯(lián)
- Hibernate一對(duì)多關(guān)聯(lián)雙向關(guān)聯(lián)代碼實(shí)現(xiàn)分享
- Hibernate組件映射代碼詳解
- Hibernate映射文件id的generator配置方法
- Hibernate使用hbm.xml配置映射關(guān)系解析
- 快速了解hibernate配置文件與映射文件
- Hibernate雙向一對(duì)一映射關(guān)系配置代碼實(shí)例
相關(guān)文章
spring啟動(dòng)錯(cuò)誤Singleton bean creation not al
本文主要介紹了spring啟動(dòng)錯(cuò)誤Singleton bean creation not allowed while the singletons of this factory are indestruction,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
java中Calendar類(lèi)用法實(shí)例詳解
這篇文章主要介紹了java中Calendar類(lèi)用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Calendar類(lèi)的函數(shù)、方法功能與相關(guān)使用技巧,需要的朋友可以參考下2017-10-10
MyBatis Plus復(fù)合主鍵問(wèn)題的解決
在數(shù)據(jù)庫(kù)設(shè)計(jì)中,有時(shí)候需要使用復(fù)合主鍵來(lái)唯一標(biāo)識(shí)表中的一行數(shù)據(jù),本文將為您詳細(xì)介紹MyBatis Plus中復(fù)合主鍵的問(wèn)題以及解決方案,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09
ScheduledThreadPoolExecutor巨坑解決
這篇文章主要為大家介紹了使用ScheduledThreadPoolExecutor遇到的巨坑解決示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
SpringSecurity退出功能實(shí)現(xiàn)的正確方式(推薦)
本文將介紹在Spring Security框架下如何實(shí)現(xiàn)用戶(hù)的"退出"logout的功能。本文通過(guò)實(shí)例代碼講解的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2019-11-11
Java關(guān)鍵字final、static使用總結(jié)
final方法不能被子類(lèi)的方法覆蓋,但可以被繼承。用static修飾的代碼塊表示靜態(tài)代碼塊,當(dāng)Java虛擬機(jī)(JVM)加載類(lèi)時(shí),就會(huì)執(zhí)行該代碼塊,下面通過(guò)本文給大家分享Java關(guān)鍵字final、static使用總結(jié),感興趣的朋友一起看看吧2017-07-07

