一口一口吃掉Hibernate(六)——多对多关联映射

       今天来讲说Hibernate中的多对多关联映射,多对多关联映射涉及到单向映射和双向映射2种。html


       首先举个多对多关联例子:用户User和角色Role,一个用户能够属于多个角色,一个角色能够有多个用户。这就是典型的多对多关联的例子。而单向关联映射则是只能由A端去操做B端,B端不能操做A端的数据。而双向关联映射则是A,B两端均可以操做另外一端的数据。java


      先说单向关联映射,实体类以下:node

/** * 学生类 * @author Longxuan * */ public class User { private int id; private String name; private Set<Role> roles; //此处省略get和set方法 } /** * 班级类 * @author Longxuan * */ public class Role { private int id; private String name; //此处省略get和set方法 } 

       映射文件:

<?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 package="com.bjpowernode.hibernate"> <class name="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"></key> <many-to-many class="Role" column="roleid"></many-to-many> </set> </class> <class name="Role" table="t_role"> <id name="id"> <generator class="native"/> </id> <property name="name"/> </class> </hibernate-mapping>

   
   User类有Role的Set集合,并且映射文件中也设置了Set标签和many-to-many标签,因此能够经过User操做Role,可是却不能从Role中操做数据。多对多的关系维护用到了第三张表t_user_role。它存放了User和Role的主键。


       从上面的单向多对多关联映射来看,我能够查某个用户属于哪些角色,可是却不能查某个角色中有哪下用户。因此为了解决这个问题,咱们采用双向关联映射。app


      其实说白了,双向关联映射就是在2端都设置一下映射关系。即在Role中一样添加User的set集合:spa

/** * 班级类 * @author Longxuan * */ public class Role { private int id; private String name; private Set<User> users; //此处省略get和set方法 } 

      映射文件中的Role部分也要作相应的修改:

<class name="Role" table="t_role"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="users" table="t_user_role"> <key column="roleid"></key> <many-to-many class="User" column="user_id"></many-to-many> </set> </class>


       值得注意的是,配置文件中的table和两个column,都必须是一致的。不然确定会出错的。若是表名不同了,那么就会生成2张中间表,一张有User维护,一张有Role。由于它变成了2个多对多单向关联映射。若是列名不一致了,就会出列来。仍是变成了2个多对多单向关联映射。同时数据也发生了冗余。


       因此双向关联映射,必定要保证2端的映射关系都设置一致了。才能称之为“双向关联映射”。.net



版权声明:本文为博主原创文章,未经博主容许不得转载。hibernate

相关文章
相关标签/搜索