最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解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>元素進行關(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)系被維護一方主鍵對應(yīng)的中間表字段 
   * joinColumn配置的是關(guān)系維護方主鍵對應(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)文章

  • Flink實戰(zhàn)之實現(xiàn)流式數(shù)據(jù)去重

    Flink實戰(zhàn)之實現(xiàn)流式數(shù)據(jù)去重

    流式數(shù)據(jù)是一種源源不斷產(chǎn)生的數(shù)據(jù),本文探索了一種流式大數(shù)據(jù)的實時去重方法,不一定適用于所有場景,不過或許可以給面對相似問題的你一點點啟發(fā),
    2025-03-03
  • Java使用openOffice對于word的轉(zhuǎn)換及遇到的問題解決

    Java使用openOffice對于word的轉(zhuǎn)換及遇到的問題解決

    開發(fā)過程中經(jīng)常會使用java將office系列文檔轉(zhuǎn)換為PDF, 一般都使用微軟提供的openoffice+jodconverter 實現(xiàn)轉(zhuǎn)換文檔,下面這篇文章主要給大家介紹了關(guān)于Java通過openOffice對于word的轉(zhuǎn)換及遇到問題的解決方法,需要的朋友可以參考下
    2018-09-09
  • Java中Exception和Error的區(qū)別詳解

    Java中Exception和Error的區(qū)別詳解

    在 Java 開發(fā)面試中,Exception 和 Error 的區(qū)別是一個經(jīng)典問題,這個問題不僅考察我們對 Java 異常處理機制的理解,還考察我們在實際開發(fā)中如何處理異常的能力,所以本文主要給大家介紹一下Java中Exception和Error的區(qū)別,需要的朋友可以參考下
    2025-04-04
  • vue3實現(xiàn)一個todo-list

    vue3實現(xiàn)一個todo-list

    這篇文章主要為大家詳細介紹了基于vuejs實現(xiàn)一個todolist項目,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能給你帶來幫助
    2021-08-08
  • mybatis配置mapper-locations的坑及解決

    mybatis配置mapper-locations的坑及解決

    這篇文章主要介紹了mybatis配置mapper-locations的坑及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • java8如何通過poi+text將word轉(zhuǎn)為pdf

    java8如何通過poi+text將word轉(zhuǎn)為pdf

    這篇文章主要介紹了java8如何通過poi+text將word轉(zhuǎn)為pdf問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • SpringBoot基于AOP的本地/遠程調(diào)用動態(tài)路由實踐指南

    SpringBoot基于AOP的本地/遠程調(diào)用動態(tài)路由實踐指南

    這篇文章主要為大家詳細介紹了SpringBoot基于AOP的本地/遠程調(diào)用動態(tài)路由實踐指南,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-07-07
  • java結(jié)束進程的實例代碼

    java結(jié)束進程的實例代碼

    java結(jié)束程序進程的方法很簡單,只要一句代碼就行,大家參考使用吧
    2013-12-12
  • Springboot配置過濾器實現(xiàn)過程解析

    Springboot配置過濾器實現(xiàn)過程解析

    這篇文章主要介紹了Springboot配置過濾器實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • 線上dubbo線程池耗盡CyclicBarrier線程屏障異常解決記錄

    線上dubbo線程池耗盡CyclicBarrier線程屏障異常解決記錄

    系統(tǒng)相關(guān)使用人員反饋系統(tǒng)故障,這篇文章主要介紹了線上dubbo線程池耗盡CyclicBarrier線程屏障異常解決的記錄,有需要的朋友可以借鑒參考下
    2022-03-03

最新評論

海盐县| 阜宁县| 共和县| 突泉县| 益阳市| 龙陵县| 理塘县| 凤庆县| 阿坝| 云和县| 余干县| 大姚县| 贵阳市| 泸水县| 邻水| 新安县| 嘉鱼县| 遂平县| 吉安市| 罗源县| 巨鹿县| 长武县| 鄂州市| 双城市| 西贡区| 吐鲁番市| 拜城县| 沐川县| 潜山县| 巴楚县| 磐安县| 津市市| 哈巴河县| 林周县| 富蕴县| 塘沽区| 上杭县| 曲水县| 环江| 抚宁县| 东乡县|