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

发布时间:2020-09-10 06:01:05 作者:lfendo
来源:脚本之家 阅读:151

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

假设,一个员工可能有多个角色,一个角色可能有多个员工,从员工或角色的角度看,这就是多对多的关系,不管从哪一个角度看,都是多对多的联系。多对多关联映射关系一般采用中间表的形式来实现,即新增一种包含关联双方主键的表。实现多对多关联关系,在数据库底层通过添加中间表指定关联关系,而在hibernate框架在双方的实体中添加一个保存对方的集合,在双方的映射文件中使用<set>元素和<many-to-many>元素进行关联关系的配置。

如下图所示:

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

(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表:

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

role表:

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

user_role表:

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

(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 xml配置

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

hibernate 映射 te

上一篇:jQuery Ajax向服务端传递数组参数值的实例代码

下一篇:python3:excel操作之读取数据并返回字典 + 写入的案例

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》