首页 > 代码库 > Hibernate-----多对多关联映射(映射文件)

Hibernate-----多对多关联映射(映射文件)

多对多可通过两个多对一实现(把第三张表抽取出一个实体,然后两个多对应一个新实体)

多对多会建立三张表,第三张表存放两个外键分别指向两个多;然后两个外键作为第三张表的联合主键


一、单向关联映射

Many(维护端:User)

<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.app.model">
       <class name="User"table="t_user">
       <id name="id">
           <generator class="increment"/>
       </id>
 
       <property name="name"/>
 
        <!--  维护关系 -->
        <!-- table:指定第三张表的表名 -->
       <set name="roles"table="t_user_role">
           <!—在‘多’的一端(第三张表)添加外键(user_id)指本端 -->
           <key column="user_id"></key>
             <!—- 在多的一端(第三张表)添加外键(role_id)指向关系端 -->
           <many-to-many class="org.app.model.Role" column="role_id" />
       </set>
    </class>
</hibernate-mapping>

To

Many(非维护端:User)

<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.app.model">
    <class name="Role" table="t_role">
       <id name="id">
           <generator class="increment"/>
       </id>
       <property name="name"/>
    </class>
</hibernate-mapping>

public void testManyToMany() {
       Session session = null;
       try {
           session = HibernateUtils.getSession();
           session.beginTransaction();
 
            // 先保存非维护端
           Role role1 = new Role();
           role1.setName("role1");
           session.save(role1);
 
           Role role2 = new Role();
           role2.setName("role2");
           session.save(role2);
 
           Role role3 = new Role();
           role3.setName("role3");
           session.save(role3);
 
           Role role4 = new Role();
           role4.setName("role4");
           session.save(role4);
 
           // 再保存维护端
           User u1 = new User();
           u1.setName("name1");
           Set<Role> u1Roles = new HashSet<Role>();
           u1Roles.add(role1);
           u1Roles.add(role2);
           u1.setRoles(u1Roles);
           session.save(u1);
 
           User u2 = new User();
           u2.setName("name2");
           Set<Role> u2Roles = new HashSet<Role>();
           u2Roles.add(role1);
           u2Roles.add(role2);
           u2Roles.add(role3);
           u2.setRoles(u2Roles);
           session.save(u2);
 
           User u3 = new User();
           u3.setName("u3");
           Set<Role> u3Roles = new HashSet<Role>();
           u3Roles.add(role3);
           u3Roles.add(role4);
           u3.setRoles(u3Roles);
           session.save(u3);
 
           session.getTransaction().commit();
       } catch (Exception e) {
           e.printStackTrace();
           session.getTransaction().rollback();
       } finally {
           HibernateUtils.closeSession(session);
       }
    }


二、双向关联映射

可在任意一端使用reverse属性反转让只让另一端作为维护端

Many(维护端:User)

<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.app.model">
    <class name="User" table="t_user">
       <id name="id">
           <generator class="increment"/>
       </id>
 
       <property name="name"/>
 
       <set name="roles"table="t_user_role">
           <key column="user_id"></key>
           <many-to-many class="org.app.model.Role" column="role_id" />
       </set>
    </class>
</hibernate-mapping>

To

Many(维护端:User)

<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.app.model">
    <class name="Role" table="t_role">
       <id name="id">
           <generator class="increment"/>
       </id>
       <property name="name"/>
 
       <set name="users"table="t_user_role">
             <!—在‘多’的一端(第三张表)添加外键(role_id)指向本端-->
           <key column="role_id"/>
             <!—维护关系:在‘多’的一端(第三张表)添加外键(user_id)指向关系端-->
           <many-to-many class="org.app.model.User" column="user_id" />
       </set>
    </class>
</hibernate-mapping>


 


Hibernate-----多对多关联映射(映射文件)