欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解hibernate雙向多對多關(guān)聯(lián)映射XML與注解版

 更新時間:2017年05月08日 17:19:26   作者:lfendo  
本篇文章主要介紹了詳解hibernate雙向多對多關(guān)聯(lián)映射XML與注解版,具有一定的參考價值,感興趣的小伙伴們可以參考一下

雙向多對多關(guān)聯(lián)映射原理:

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

如下圖所示:

(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("數(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("項目會計"); 
      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ù)庫內(nèi)容為:

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表示多對多關(guān)聯(lián),對于這種關(guān)聯(lián)極少數(shù)情況會使用級聯(lián)刪除,我這里設(shè)置的是級聯(lián)刷新; 
   * 因為有中間表的存在這里使用@JoinTable來設(shè)置關(guān)聯(lián)表后面的name配置的是關(guān)聯(lián)表的名稱 
   * inverseJoinColumn配置的是關(guān)系被維護(hù)一方主鍵對應(yīng)的中間表字段 
   * joinColumn配置的是關(guān)系維護(hù)方主鍵對應(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; 
  } 
   
   
} 

測試類:

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)建兩個用戶 
    User us1=new User(); 
    us1.setUname("小明"); 
     
    User us2=new User(); 
    us2.setUname("小黑"); 
     
    //創(chuàng)建用戶集合 
    Set<User> su=new HashSet<User>(); 
    su.add(us1); 
    su.add(us2); 
     
     
    //創(chuàng)建兩個角色 
    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); 
     
    //往用戶添加角色集合 
    us1.setRoles(sr); 
    us2.setRoles(sr); 
     
    //保存用戶和角色 
    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 
    (?, ?) 

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • spring啟動錯誤Singleton bean creation not allowed while the singletons of this factory are indestruction

    spring啟動錯誤Singleton bean creation not al

    本文主要介紹了spring啟動錯誤Singleton bean creation not allowed while the singletons of this factory are indestruction,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 老生常談spring的事務(wù)傳播機制

    老生常談spring的事務(wù)傳播機制

    這篇文章主要介紹了spring的事務(wù)傳播機制,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • java中Calendar類用法實例詳解

    java中Calendar類用法實例詳解

    這篇文章主要介紹了java中Calendar類用法,結(jié)合實例形式較為詳細(xì)的分析了Calendar類的函數(shù)、方法功能與相關(guān)使用技巧,需要的朋友可以參考下
    2017-10-10
  • MyBatis Plus復(fù)合主鍵問題的解決

    MyBatis Plus復(fù)合主鍵問題的解決

    在數(shù)據(jù)庫設(shè)計中,有時候需要使用復(fù)合主鍵來唯一標(biāo)識表中的一行數(shù)據(jù),本文將為您詳細(xì)介紹MyBatis Plus中復(fù)合主鍵的問題以及解決方案,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • ScheduledThreadPoolExecutor巨坑解決

    ScheduledThreadPoolExecutor巨坑解決

    這篇文章主要為大家介紹了使用ScheduledThreadPoolExecutor遇到的巨坑解決示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • SpringSecurity退出功能實現(xiàn)的正確方式(推薦)

    SpringSecurity退出功能實現(xiàn)的正確方式(推薦)

    本文將介紹在Spring Security框架下如何實現(xiàn)用戶的"退出"logout的功能。本文通過實例代碼講解的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友參考下吧
    2019-11-11
  • Java中URL的處理方法詳解

    Java中URL的處理方法詳解

    URL(Uniform?Resource?Locator)中文名為統(tǒng)一資源定位符,有時也被俗稱為網(wǎng)頁地址,表示為互聯(lián)網(wǎng)上的資源,本文主要為大家介紹了Java是如何處理URL的,感興趣的可以了解一下
    2023-05-05
  • Java9以后的垃圾回收的具體用法

    Java9以后的垃圾回收的具體用法

    這篇文章主要介紹了Java9以后的垃圾回收的具體用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Java關(guān)鍵字final、static使用總結(jié)

    Java關(guān)鍵字final、static使用總結(jié)

    final方法不能被子類的方法覆蓋,但可以被繼承。用static修飾的代碼塊表示靜態(tài)代碼塊,當(dāng)Java虛擬機(JVM)加載類時,就會執(zhí)行該代碼塊,下面通過本文給大家分享Java關(guān)鍵字final、static使用總結(jié),感興趣的朋友一起看看吧
    2017-07-07
  • Java使用Ajax異步上傳文件

    Java使用Ajax異步上傳文件

    使用Ajax上傳文件的應(yīng)用場景頗多,比如上傳用戶頭像、博客文章中插入圖片、對認(rèn)證用戶相關(guān)身份進(jìn)行校驗等等很多很多。本文提供一個簡單的示例供大家參考
    2021-05-05

最新評論