zoukankan      html  css  js  c++  java
  • 【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属性。

  • 相关阅读:
    将smarty安装到MVC架构中
    MVC开发模式以及Smarty模板引擎的使用
    LAMP环境搭建+配置虚拟域名
    第四节 块标签、含样式的标签
    第三节 p标签
    第二节 标题标签
    第一节 简单的html
    第十一节 python和集群交互
    第十节 redis集群搭建
    第九节 搭建主从服务
  • 原文地址:https://www.cnblogs.com/victor-grace/p/7253655.html
Copyright © 2011-2022 走看看