• 【Hibernate】--关联关系映射:多对多映射


        多对多的关系使我们经常遇到的,下面来说一下如何使用Hibernate来描述这种关联关系。

        在使用ER来描述时,我们通常会抽出一种表来描述他们的关系,同样的,在进行关联映射时我们也采用这样的方式。描述如下:

        

        说明:多对多关联映射,即对象之间多与多的关系,一般需要引入第三个实体来描述他们的关系,通过外键组合成第三张表。实例如下:

        实体类:(get和set方法省略)

           User.java:         

    public class User {
      private int id;
      private String name;
      //使用set集合,关联role
      private Set role;
    }
           Role.java:         

    public class Role {
      private int id;
      private String name;
      //通过set集合,关联user
      private Set user;
    }
         映射文件:

           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="com.tgb.hibernate.User" table="t_user_many2many">
        <id name="id">
          <generator class="native"/>
        </id>
        <!-- name值是实体类中引入的role集合名词 -->
        <!-- 组成第三张表名为t_user_role -->
        <set name="role" table="t_user_role">
          <!-- 设置外键 -->
          <key column="user_id" not-null="true"/>
          <!-- 关联Role -->
          <many-to-many class="com.tgb.hibernate.Role" column="role_id"/>
        </set>
       
      </class>
    </hibernate-mapping>
         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="com.tgb.hibernate.Role" table="t_role_many2many">
        <id name="id">
          <generator class="native"/>
        </id>
        <property name="name" />
        <!-- name值是实体类中引入的user集合名词 -->
        <!-- 组成第三张表名为t_user_role -->
        <set name="user" table="t_user_role">
          <!-- 设置外键 -->
          <key column="role_id" not-null="true"/>
          <!-- 关联User -->
          <many-to-many class="com.tgb.hibernate.User" column="user_id"/>
        </set>
      </class>
    </hibernate-mapping>
        编写测试类,进行数据维护:      

    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.setRole(u1Roles);
    			session.save(u1);
    			
    			User u2 = new User();
    			u2.setName("李四");
    			Set u2Roles = new HashSet();
    			u2Roles.add(r1);
    			u2Roles.add(r2);
    			u2Roles.add(r3);
    			u2.setRole(u2Roles);
    			session.save(u2);
    		  
    		  session.getTransaction().commit();
    	  }
    	  catch(Exception e){
    		  e.printStackTrace();
    		  session.getTransaction().rollback();
    	  }
    	  finally{
    		  HibernateUtils.closeSession(session);
    	  }
    	  
      }


        注意:

          使用<set>标签进行管理关系设置,合成第三张表。

          由<key>标签进行外键的设置。

          使用<many-to-many>标签进行关联。

          多对多关联,一般最好是由一端来进行数据的维护,即在某一段设置inverse属性。

  • 相关阅读:
    ASP.NET MVC+EF在服务端分页使用jqGrid以及jquery Datatables的注意事项
    Oracle10g在Win2008R2下因版本无法安装问题的解决
    oracle 表被锁了解决方案
    用shell获得hadoop中mapreduce任务运行结果的状态
    发现一个c++ vector sort的bug
    跳青蛙问题与变态跳青蛙问题
    关于const *和 * const
    格雷码的计算(转)
    不安装oracle客户端,如何运行sqlplus
    Sqoop 将hdfs上的文件导入到oracle中,关于date类型的问题
  • 原文地址:https://www.cnblogs.com/victor-grace/p/7253655.html
Copyright © 2020-2023  润新知