详解hibernate双向多对多关联映射XML与注解版

 更新时间:2017年05月08日 17:19:26   作者:lfendo  
本篇文章主要介绍了详解hibernate双向多对多关联映射XML与注解版,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

双向多对多关联映射原理:

假设,一个员工可能有多个角色,一个角色可能有多个员工,从员工或角色的角度看,这就是多对多的关系,不管从哪一个角度看,都是多对多的联系。多对多关联映射关系一般采用中间表的形式来实现,即新增一种包含关联双方主键的表。实现多对多关联关系,在数据库底层通过添加中间表指定关联关系,而在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 
    (?, ?) 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 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,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • 老生常谈spring的事务传播机制

    老生常谈spring的事务传播机制

    这篇文章主要介绍了spring的事务传播机制,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • java中Calendar类用法实例详解

    java中Calendar类用法实例详解

    这篇文章主要介绍了java中Calendar类用法,结合实例形式较为详细的分析了Calendar类的函数、方法功能与相关使用技巧,需要的朋友可以参考下
    2017-10-10
  • MyBatis Plus复合主键问题的解决

    MyBatis Plus复合主键问题的解决

    在数据库设计中,有时候需要使用复合主键来唯一标识表中的一行数据,本文将为您详细介绍MyBatis Plus中复合主键的问题以及解决方案,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • ScheduledThreadPoolExecutor巨坑解决

    ScheduledThreadPoolExecutor巨坑解决

    这篇文章主要为大家介绍了使用ScheduledThreadPoolExecutor遇到的巨坑解决示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • SpringSecurity退出功能实现的正确方式(推荐)

    SpringSecurity退出功能实现的正确方式(推荐)

    本文将介绍在Spring Security框架下如何实现用户的"退出"logout的功能。本文通过实例代码讲解的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧
    2019-11-11
  • Java中URL的处理方法详解

    Java中URL的处理方法详解

    URL(Uniform Resource Locator)中文名为统一资源定位符,有时也被俗称为网页地址,表示为互联网上的资源,本文主要为大家介绍了Java是如何处理URL的,感兴趣的可以了解一下
    2023-05-05
  • Java9以后的垃圾回收的具体用法

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

    这篇文章主要介绍了Java9以后的垃圾回收的具体用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Java关键字final、static使用总结

    Java关键字final、static使用总结

    final方法不能被子类的方法覆盖,但可以被继承。用static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块,下面通过本文给大家分享Java关键字final、static使用总结,感兴趣的朋友一起看看吧
    2017-07-07
  • Java使用Ajax异步上传文件

    Java使用Ajax异步上传文件

    使用Ajax上传文件的应用场景颇多,比如上传用户头像、博客文章中插入图片、对认证用户相关身份进行校验等等很多很多。本文提供一个简单的示例供大家参考
    2021-05-05

最新评论