全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

java Hibernate多对多映射详解及实例代码

java Hibernate多对多映射

前言:

一、单向多对多

    单向多对多的例子用人和职位来举例,一个人可以有多个职位,一个职位会有多个人。单向多对多是指只能在一端来查询获取另一端的内容。多对多的关系在生成关系模型时会生成对象之前的关联表,关联表中存放着两个关系表的主键,它们的关系如下所示:



代码部分: 

(1)映射和关系类

因为是单向的关系,所以只需要在一端进行维护,所以我们需要在User.hbm.xml配置文件中添加<many-to-many>标签,并在标签中加上对应的列关系,在<set>表中添加table属性来指明生成新表,User.hbm.xml代码如下:

<span style="font-family:KaiTi_GB2312;font-size:18px;"><hibernate-mapping> 
  <class name="com.bjpowernode.hibernate.User" table="t_user"> 
    <id name="id"> 
      <generator class="native"/> 
    </id> 
    <property name="name"/> 
    <set name="roles" table="t_user_role"> 
      <key column="user_id"/> 
      <many-to-many class="com.bjpowernode.hibernate.Role" column="role_id" />  
    </set> 
  </class> 
</hibernate-mapping></span> 

Role.hbm.xml代码比较简单,不需要添加多余的标签来维护关系:

<hibernate-mapping> 
  <class name="com.bjpowernode.hibernate.Role" table="t_role"> 
    <id name="id"> 
      <generator class="native"/> 
    </id> 
    <property name="name"/> 
  </class> 
</hibernate-mapping> 

因为user的映射中有set映射,所以需要在相应的类文件中添加Hashset,User.java代码如下:

<span style="font-family:KaiTi_GB2312;font-size:18px;">import java.util.Set; 
 
public class User { 
   
  private int id; 
   
  private String name; 
 
  private Set roles; 
   
  public int getId() { 
    return id; 
  } 
 
  public void setId(int id) { 
    this.id = id; 
  } 
 
  public String getName() { 
    return name; 
  } 
 
  public void setName(String name) { 
    this.name = name; 
  } 
 
  public Set getRoles() { 
    return roles; 
  } 
 
  public void setRoles(Set roles) { 
    this.roles = roles; 
  } 
}</span> 

Role.java代码如下:

public class Role { 
 
  private int id; 
   
  private String name; 
   
  public int getId() { 
    return id; 
  } 
 
  public void setId(int id) { 
    this.id = id; 
  } 
 
  public String getName() { 
    return name; 
  } 
 
  public void setName(String name) { 
    this.name = name; 
  } 
} 

(2)添加和读取数据:

进行添加数据时,需要首先吧关系保存到数据库中,然后创建用户Hash表,在hash表中添加对应的关系,最后创建用户,将hash表添加到用户上。这部分需注意的是写入的先后顺序,否则会出现很多null值,和之前的映射一样的道理。

public void testSave1() { 
    Session session = null; 
    try { 
      session = HibernateUtils.getSession(); 
      session.beginTransaction(); 
       
      Role r1 = new Role(); 
      r1.setName("数据录入人员"); 
      session.save(r1); 
       
      Role r2 = new Role(); 
      r2.setName("商务主管"); 
      session.save(r2); 
       
      Role r3 = new Role(); 
      r3.setName("商务经理"); 
      session.save(r3); 
       
      Role r4 = new Role(); 
      r4.setName("项目会计"); 
      session.save(r4); 
       
      User u1 = new User(); 
      u1.setName("张三"); 
      Set u1Roles = new HashSet(); 
      u1Roles.add(r1); 
      u1Roles.add(r2); 
      u1.setRoles(u1Roles); 
      session.save(u1); 
       
      User u2 = new User(); 
      u2.setName("李四"); 
      Set u2Roles = new HashSet(); 
      u2Roles.add(r1); 
      u2Roles.add(r2); 
      u2Roles.add(r3); 
      u2.setRoles(u2Roles); 
      session.save(u2); 
       
      User u3 = new User(); 
      u3.setName("王五"); 
      Set u3Roles = new HashSet(); 
      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); 
    } 
  } 

读取时因为是单向关系,只需要通过一来读取另一端的内容,通过user来读取role的内容。代码如下:

public void testLoad1() { 
    Session session = null; 
    try { 
      session = HibernateUtils.getSession(); 
      session.beginTransaction(); 
      User user = (User)session.load(User.class, 2); 
      System.out.println(user.getName()); 
      for (Iterator iter=user.getRoles().iterator(); iter.hasNext();) { 
        Role role = (Role)iter.next(); 
        System.out.println(role.getName()); 
      } 
      session.getTransaction().commit(); 
    }catch(Exception e) { 
      e.printStackTrace(); 
      session.getTransaction().rollback(); 
    }finally { 
      HibernateUtils.closeSession(session); 
    } 
  }   

二、双向多对多映射

   和之前介绍的一样,双向多对多就是在两端同时维护关系,从任何一端都能加载到另一端的内容,话不多说直接上代码:

     因为是双向的所以需要同时加入双向的集合映射,在配置文件中添加<set>标签,添加多对多标签,Role.hbm.xml代码如下:

<hibernate-mapping> 
  <class name="com.bjpowernode.hibernate.Role" table="t_role"> 
    <id name="id"> 
      <generator class="native"/> 
    </id> 
    <property name="name"/> 
    <set name="users" table="t_user_role"> 
      <key column="role_id" not-null="true"/> 
      <many-to-many class="com.bjpowernode.hibernate.User" column="user_id"/> 
    </set> 
  </class> 
</hibernate-mapping> 

User.hbm.xml代码如下,和单向映射代码是一样的:

<span style="font-family:KaiTi_GB2312;font-size:18px;"><hibernate-mapping> 
  <class name="com.bjpowernode.hibernate.Role" table="t_role"> 
    <id name="id"> 
      <generator class="native"/> 
    </id> 
    <property name="name"/> 
    <set name="users" table="t_user_role"> 
      <key column="role_id" not-null="true"/> 
      <many-to-many class="com.bjpowernode.hibernate.User" column="user_id"/> 
    </set> 
  </class> 
</hibernate-mapping> 
</span> 

Role.java部分,和单向的user.java一样需要添加集合映射set,代码如下:

import java.util.Set; 
 
public class Role { 
 
  private int id; 
   
  private String name; 
   
  private Set users; 
   
  public int getId() { 
    return id; 
  } 
 
  public void setId(int id) { 
    this.id = id; 
  } 
 
  public String getName() { 
    return name; 
  } 
 
  public void setName(String name) { 
    this.name = name; 
  } 
 
  public Set getUsers() { 
    return users; 
  } 
 
  public void setUsers(Set users) { 
    this.users = users; 
  } 
} 

User.hbm.xml和User.java代码和上文中的代码相同,就不全部放上来了。

小结:

      单向和多向通过几篇博客的介绍相信大家已经明白,我们只需要记住单向的双向的也就会了,挺简单的。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# java  # Hibernate多对多映射  # Hibernate多对多映射详解及实例  # Hibernate映射  # JAVA编程实现UDP网络通讯的方法示例  # JAVA编程实现TCP网络通讯的方法示例  # 基于Java网络编程和多线程的多对多聊天系统  # Java实现多对多网络通讯的流程  # 只需  # 配置文件  # 另一端  # 的是  # 来了  # 也就  # 多个  # 不需要  # 就不  # 都能  # 是指  # 中有  # 并在  # 要在  # 有多  # 这部  # 希望能  # 只需要  # 所示  # 在一 


相关文章: 网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?  建站三合一如何选?哪家性价比更高?  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  建站之星下载版如何获取与安装?  微信小程序 五星评分(包括半颗星评分)实例代码  小程序网站制作需要准备什么资料,如何制作小程序?  如何高效完成独享虚拟主机建站?  正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?  广州建站公司哪家好?十大优质服务商推荐  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  如何在云主机上快速搭建多站点网站?  简单实现Android文件上传  如何零成本快速生成个人自助网站?  ,制作一个手机app网站要多少钱?  如何配置IIS站点权限与局域网访问?  实现虚拟支付需哪些建站技术支撑?  开封网站制作公司,网络用语开封是什么意思?  香港服务器租用费用高吗?如何避免常见误区?  如何快速搭建支持数据库操作的智能建站平台?  大连 网站制作,大连天途有线官网?  网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?  如何通过商城自助建站源码实现零基础高效建站?  如何在Windows服务器上快速搭建网站?  如何在香港服务器上快速搭建免备案网站?  太原网站制作公司有哪些,网约车营运证查询官网?  网站代码制作软件有哪些,如何生成自己网站的代码?  如何基于云服务器快速搭建个人网站?  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  公司网站的制作公司,企业网站制作基本流程有哪些?  北京网站制作公司哪家好一点,北京租房网站有哪些?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  如何在VPS电脑上快速搭建网站?  制作网站的模板软件,网站怎么建设?  威客平台建站流程解析:高效搭建教程与设计优化方案  北京网站制作的公司有哪些,北京白云观官方网站?  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  建站之星收费标准详解:套餐费用及年费价格表一览  建站之星价格显示格式升级,你的预算足够吗?  网站制作员失业,怎样查看自己网站的注册者?  如何在七牛云存储上搭建网站并设置自定义域名?  如何设置并定期更换建站之星安全管理员密码?  教育培训网站制作流程,请问edu教育网站的域名怎么申请?  如何选择适配移动端的WAP自助建站平台?  如何快速生成ASP一键建站模板并优化安全性?  C++如何使用std::optional?(处理可选值)  已有域名和空间如何搭建网站?  制作公司内部网站有哪些,内网如何建网站?  免费网站制作appp,免费制作app哪个平台好?  如何用PHP快速搭建CMS系统? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。