映射原理:
不论是单项关联还是双向关联都是通过第三张表,将两个表中的主键放到第三个表中做一个关联。用第三张表来解决可能会造成数据冗余的问题。
举例:
一个用户(User)对多个角色(Role),一个角色对多个用户。
分类:
一、单项的多对多关联映射(单向User--->Role)
对象模型
关系模型
实例
下面我们看一下实体类和映射文件的代码。
User
public class User { private int id; private String name; private Set roles; .... }
Role
public class Role { private int id; private String name; ... }
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 package="com.liang.hibernate"> <class name="User" table="t_user"> <id name="id"> <generator class="native"></generator> </id> <property name="name"></property> <!-- roles属性,表达的是本对象(User)与Role的多对多的关系 --> <set name="roles" table="t_user_role"> <!--当前表(User)的主键--> <key column="user_id"></key> <many-to-many class="Role" column="role_id"></many-to-many> </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 package="com.liang.hibernate"> <class name="Role" table="t_role"> <id name="id"> <generator class="native"></generator> </id> <property name="name"></property> </class> </hibernate-mapping>
多对多关联映射,在实体类中,跟一对多关联映射一样,也是用集合来表示的。<set>标签中用table属性重命名中间表名称,<key>标签定义当前表的主键,用<many-to-many>标签来关联另一张表。
二、双向的多对多关联映射(双向User<--->Role)
下面我们看一下实体类和映射文件的代码。
User同上
Role
public class Role { private int id; private String name; private Set users; ... }
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 package="com.liang.hibernate"> <class name="User" table="t_user"> <id name="id"> <generator class="native"></generator> </id> <property name="name"></property> <!-- roles属性,表达的是本对象(User)与Role的多对多的关系 --> <set name="roles" table="t_user_role"> <!--当前表(User)的主键--> <key column="user_id"></key> <many-to-many class="Role" column="role_id"></many-to-many> </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 package="com.liang.hibernate"> <class name="Role" table="t_role"> <id name="id"> <generator class="native"></generator> </id> <property name="name"></property> <!-- users属性,表达的是本对象(Role)与User的多对多的关系 --> <set name="users" table="t_user_role"> <!--当前表(Role)的主键--> <key column="role_id"></key> <many-to-many class="User" column="user_id"></many-to-many> </set> </class> </hibernate-mapping>
多对多双向关系中,User和Role的映射文件相同,值得注意的是生成的中间表名称必须一样,生成中间表的字段必须一样。