Hibernate映射关系-多对多
2014-11-26 20:32
162 查看
接着上几篇博客,hibernate的映射关系,今天我们说说基本关系的最后一种:多对多。
hibernate实现:多对多关联关系采用第三张表的方式来实现,将多对多转化为两个一对多。
当然,多对多也是有方向的。拿用户——角色来画类图。
1、单向关联——用户关联角色
多对多关系在hbm文件中的配置信息:
角色hbm.xml
那么生成的数据库表如图:
2、用户-角色双向关联:
类图如下;
配置信息如下
role.hbm.xml配置如下:
3、单向与双向
其实不难发现,当关联关系由单向变成双向之后,user的配置文件没有发生改变,role的配置文件多了<set>标签。最终生成的数据库都是一样的,只是通过实体访问数据库的时候有差别,只有维护关系的一方可以访问到另一方。
其实多对多就是两个一对多,它的配置没什么新奇的相对于一对多。在多对多的关系设计中,一般都会使用一个中间表将他们拆分成两个一对多。<set>标签中的"table"属性就是用于指定中间表的。中间表一般包含两个表的主键值,该表用于存储两表之间的关系。由于被拆成了两个一对多,中间表是多方,它是使用外键关联的,<key>是用于指定外键的,用于从中间表取出相应的数据。中间表每一行数据只包含了两个关系表的主键,要获取与自己关联的对象集合,还需要取出由外键所获得的记录中的另一个主键值,由它到对应的表中取出数据,填充到集合中。<many-to-many>中的"column"属性是用于指定按那一列的值获取对应的数据。
例如用user表来说,它与role表使用一个中间表user_role关联。如果要获取user记录对应的role的记录,首先需要使用外键"userID"从user_role表中取得相应的数据,然后在取得的数据中使用"roleid"列的值,在role表中检索出相关的role数据。其实,为了便于理解,你可以在使用user表的使用就把中间表看成是role表,反之亦然。这样就可以使用一对多的思维来理解了.
对象间的简单映射关系就说到这里,下节课,说继承映射。
一 、多对多关系
现象:多对多关系,在生活中很常见,就那学生与选修课之间的关系,一个学生可以选择多门选修课,而每个选修课又可以被多名学生选择。还有就是一个用户可以有多个角色,一个角色可以有多个人,等等这样的例子很多。hibernate实现:多对多关联关系采用第三张表的方式来实现,将多对多转化为两个一对多。
当然,多对多也是有方向的。拿用户——角色来画类图。
1、单向关联——用户关联角色
多对多关系在hbm文件中的配置信息:
角色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.bjpowernode.hibernate.Role" table="t_role"> <id name="id"> <generator class="native"/> </id> <property name="name"/> </class> </hibernate-mapping>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.bjpowernode.hibernate.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"/> <many-to-many class="com.bjpowernode.hibernate.Role" column="role_id" /> </set> </class> </hibernate-mapping>
那么生成的数据库表如图:
2、用户-角色双向关联:
类图如下;
配置信息如下
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.bjpowernode.hibernate.Role" table="t_role"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="users" table="t_user_role"> <key column="role_id" not-null="true"/> <many-to-many class="com.bjpowernode.hibernate.User" column="user_id"/> </set> </class> </hibernate-mapping>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.bjpowernode.hibernate.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" not-null="true"/> <many-to-many class="com.bjpowernode.hibernate.Role" column="role_id" /> </set> </class> </hibernate-mapping>
3、单向与双向
其实不难发现,当关联关系由单向变成双向之后,user的配置文件没有发生改变,role的配置文件多了<set>标签。最终生成的数据库都是一样的,只是通过实体访问数据库的时候有差别,只有维护关系的一方可以访问到另一方。
二、对比一对多
其实多对多就是两个一对多,它的配置没什么新奇的相对于一对多。在多对多的关系设计中,一般都会使用一个中间表将他们拆分成两个一对多。<set>标签中的"table"属性就是用于指定中间表的。中间表一般包含两个表的主键值,该表用于存储两表之间的关系。由于被拆成了两个一对多,中间表是多方,它是使用外键关联的,<key>是用于指定外键的,用于从中间表取出相应的数据。中间表每一行数据只包含了两个关系表的主键,要获取与自己关联的对象集合,还需要取出由外键所获得的记录中的另一个主键值,由它到对应的表中取出数据,填充到集合中。<many-to-many>中的"column"属性是用于指定按那一列的值获取对应的数据。例如用user表来说,它与role表使用一个中间表user_role关联。如果要获取user记录对应的role的记录,首先需要使用外键"userID"从user_role表中取得相应的数据,然后在取得的数据中使用"roleid"列的值,在role表中检索出相关的role数据。其实,为了便于理解,你可以在使用user表的使用就把中间表看成是role表,反之亦然。这样就可以使用一对多的思维来理解了.
对象间的简单映射关系就说到这里,下节课,说继承映射。
相关文章推荐
- hibernate 映射组成关系
- Hibernate三种映射关系
- hibernate---->对象/关系数据库映射基础
- SSH深度历险(一)深入浅出Hibernate架构(一)-------映射解析——七种映射关系
- Java类型、Hibernate映射类型以及SQL类型之间的对应关系
- hibernate对映射关系进行排序
- J2EE系列之Hibernate4学习笔记(十一)--Hibernate继承关系映射(根类对应一个表)
- Hibernate 一对一关系映射
- Hibernate实现many-to-many的映射关系
- Hibernate关系配置之多对多映射配置
- hibernate继承关系映射到表的总结
- [原创]java WEB学习笔记77:Hibernate学习之路---Hibernate 版本 helloword 与 解析,.环境搭建,hibernate.cfg.xml文件及参数说明,持久化类,对象-关系映射文件.hbm.xml,Hibernate API (Configuration 类,SessionFactory 接口,Session 接口,Transaction(事务))
- Java之旅hibernate(8)——基本关系映射
- hibernate 实体关系映射笔记
- [原]Java web学习系列之 Java web开发中的Hibernate对象关系映射框架
- Hibernate实体关系映射——双边的多对多关系
- Hibernate 关系映射(三) 基于外键关联的单向 1:1
- hibernate关系映射(一对一)
- jbpm4.4下hibernate映射文件中表跟类的对应关系
- Hibernate之实体关系映射