Hibernate详解(4)——多对多映射分析
2012-05-26 16:01
267 查看
Hibernate多对多关联也是比较常见的一种。对于多对多关系,我们都是采用引入第三方表来描述它们之间的关联的。本节主要讲述一下Hibernate多对多关联。多对多关联根据需求也可以分为单向多对多和双向多对多。这里用比较常见的多对多关系用户与角色的关系来举例。
它们的配置文件User.hbm.xml和分别Role.hbm.xml如下:
这里面User实体持有一个Role的set集合,使用第三方表把两个表的主键关联起来.
双向对多对的配置文件就是有两个单向多对多。其中User的一端和单向的是一样的。下面是Role.hbm.xml
其实多对多就是两个一对多,它的配置没什么新奇的相对于一对多。在多对多的关系设计中,一般都会使用一个中间表将他们拆分成两个一对多。<set>标签中的"table"属性就是用于指定中间表的。中间表一般包含两个表的主键值,该表用于存储两表之间的关系。由于被拆成了两个一对多,中间表是多方,它是使用外键关联的,<key>是用于指定外键的,用于从中间表取出相应的数据。中间表每一行数据只包含了两个关系表的主键,要获取与自己关联的对象集合,还需要取出由外键所获得的记录中的另一个主键值,由它到对应的表中取出数据,填充到集合中。<many-to-many>中的"column"属性是用于指定按那一列的值获取对应的数据。
单向多对多
如果要求拿到用户需要知道它的角色,而不去关心反向的加载。那么这个就是单向的。首先看UML图。它们的配置文件User.hbm.xml和分别Role.hbm.xml如下:
<?xmlversion="1.0"?> <!DOCTYPEhibernate-mapping PUBLIC "-//Hibernate/HibernateMapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <classname="com.lsh.hibernate.User" table="t_user"> <idname="id"> <generatorclass="native"/> </id> <propertyname="name"/> <setname="roles" table="t_user_role"> <keycolumn="user_id"/> <many-to-manyclass="com.lsh.hibernate.Role" column="role_id"/> </set> </class> </hibernate-mapping> <?xmlversion="1.0"?> <!DOCTYPEhibernate-mapping PUBLIC "-//Hibernate/HibernateMapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <classname="com.lsh.hibernate.Role" table="t_role"> <idname="id"> <generatorclass="native"/> </id> <propertyname="name"/> </class> </hibernate-mapping>
这里面User实体持有一个Role的set集合,使用第三方表把两个表的主键关联起来.
双向多对多
双向多对多就是双方都运用对方的一个引用。在任何一方加载的时候都会自动加载与其关联的另一端数据。首先看一下UML图双向对多对的配置文件就是有两个单向多对多。其中User的一端和单向的是一样的。下面是Role.hbm.xml
<?xmlversion="1.0"?> <!DOCTYPEhibernate-mapping PUBLIC "-//Hibernate/HibernateMapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <classname="com.lsh.hibernate.Role" table="t_role"> <idname="id"> <generatorclass="native"/> </id> <propertyname="name"/> <setname="users" table="t_user_role"> <keycolumn="role_id" not-null="true"/> <many-to-manyclass="com.lsh.hibernate.User" column="user_id"/> </set> </class> </hibernate-mapping>
其实多对多就是两个一对多,它的配置没什么新奇的相对于一对多。在多对多的关系设计中,一般都会使用一个中间表将他们拆分成两个一对多。<set>标签中的"table"属性就是用于指定中间表的。中间表一般包含两个表的主键值,该表用于存储两表之间的关系。由于被拆成了两个一对多,中间表是多方,它是使用外键关联的,<key>是用于指定外键的,用于从中间表取出相应的数据。中间表每一行数据只包含了两个关系表的主键,要获取与自己关联的对象集合,还需要取出由外键所获得的记录中的另一个主键值,由它到对应的表中取出数据,填充到集合中。<many-to-many>中的"column"属性是用于指定按那一列的值获取对应的数据。
相关文章推荐
- Hibernate详解(2)——一对多映射分析
- Hibernate详解(2)——一对多映射分析
- Hibernate详解(4)——多对多映射分析
- Hibernate详解(3)——一对一映射分析
- Hibernate详解(3)——一对一映射分析
- Hibernate中 多对一,一对多映射关系分析详解
- Hibernate详解(2)——一对多映射分析 .
- Hibernate详解(3)——一对一映射分析
- hibernate集合映射inverse和cascade详解
- Hibernate映射文件详解
- Hibernate映射详解(二)--多对一,一对多单向,一对多双向关联映射
- 【Hibernate步步为营】--双向关联一对一映射详解(二)
- Hibernate(三)Hibernate常用API详解及源码分析
- Hibernate映射详解(六)--继承映射
- hibernate映射总结详解: 映射多对一单向关联关系
- Hibernate配置详解 --POJO映射文件 – 类映射
- Hibernate关联映射 --- 多对多实例分析(双向关联)
- hibernate映射详解:一对一映射的两种实现方式
- Hibernate配置文件中映射元素详解
- hibernate集合映射inverse和cascade详解