上上篇博文【SSH进阶之路】Hibernate映射——一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证端加载人得信息。
上篇博文【SSH进阶之路】Hibernate映射——一对一双向关联映射(六),双向关联映射解决了单向关联映射只能从一端加载信息的缺陷,当然,双向关联映射并不影响存储,只影响加载。下面我们开始今天的内容:
一对多关联映射
映射原理
一对多关联映射和多对一关联映射的映射原理是一致的,都是在多的一端加入一个外键,指向一的一端。关联关系都是由多端维护,只是在写映射时发生了变化。
多对一和一对多的区别
多对一和一对多的区别在于维护的关系不同:
(1)多对一:多端维护一端的关系,在加载多端时,可以将一端加载上来。
(2)一对多:一端维护多端的关系,在加载一端时,可以将多端加载上来。
分类
一对多单向关联映射
对象模型
从对象模型中,我们可以看出,Group持有User的一个引用。由于是单向关联,所以数据在加载Group时,会把User加载上来,但是User并不知道Group的存在。
我们先看一下Group和User的实体,以及映射文件。
Group
package com.liang.hibernate; import java.util.Set; public class Group { private int id; private String name; private Set users; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set getUsers() { return users; } public void setUsers(Set users) { this.users = users; } }
User
package com.liang.hibernate; public class User { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = 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> <class name="com.liang.hibernate.User" table="t_user"> <id name="id"> <generator class="native"/> </id> <property name="name"/> </class> </hibernate-mapping>
Group.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.liang.hibernate.Group" table="t_group"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <!-- users属性,表达的是本对象与User的一对多的关系 --> <set name="users"> <!--当前表(Group)的主键--> <key column="groupid"/> <one-to-many class="com.liang.hibernate.User"/> </set> </class> </hibernate-mapping>
生成的表结构和测试数据
缺点
1)因为多端User不知道Group的存在(也就是User不维护与Group的关系),所以在保存User时,关系字段groupId为null,如果该字段设置为非空,则将无法保存数据。
2)因为User不维护关系,而Group维护关系,Group就会发出多余的update语句,保证Group和User有关系,这样加载Group时才把该Users对应的用户加载上来。
一对多双向关联映射
对象模型
双向关联映射对比单向关联映射,对象的加载方向由单向变成了双向。
我们看一下Group和User的实体,映射文件
Group
package com.liang.hibernate; import java.util.Set; public class Group { private int id; private String name; private Set users; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set getUsers() { return users; } public void setUsers(Set users) { this.users = users; } }
User
package com.liang.hibernate; public class User { private int id; private String name; private Group groups; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Group getGroups() { return groups; } public void setGroups(Group groups) { this.groups = groups; } }
Group.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="Group" table="t_group"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <!-- 影响控制反转:inverse="false",多的一端维护关系,让一的一端失效 --> <set name="users" inverse="true"> <key column="groupid" not-null="true"/> <one-to-many class="User"/> </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 package="com.liang.hibernate"> <class name="User" table="t_user"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <!-- groups属性,表达的是本对象与Group的多对一的关系 --> <many-to-one name="groups" class="Group" column="groupid"/> </class> </hibernate-mapping>
生成的表和测试数据
一对多双向关联的映射方式:
1)在一的一端的集合上采用<key>标签,在多的一端加入一个外键
2)在多的一端采用<many-to-one>标签
注意:<key>标签和<many-to-one>标签加入的字段保持一直,否则会产生数据混乱。
inverse属性:
inverse属性可以用在一对多和多对多双向关联上,inverse属性默认为false,为false表示本端维护关系,如果inverse为true,则本端不能维护关系,会交给另一端维护关系,本端失效。所以一对多关联映射我们通常在多的一端维护关系,让一的一端失效,所以设置为inverse为true。
注意:inverse属性,只影响数据的存储,也就是持久化。
目的
一对多双向关联映射的目的主要是为了解决一对多单向关联的缺陷而不是需求驱动的。
总结
一对多关联映射还是很简单的,下篇博文我们介绍多对多关联映射。谢谢关注。
相关推荐
hibernate关联映射详解SSH 多对多,一对多关系对象映射
hibernate核心,一对多,多对多映射讲解,看了就完全搞明白了
该资源包含了一些常用的hibernate关联映射实例。包括一对多,多对多,继承映射,等,是学习hibernate的必备品
Hibernate映射配置详解
ssh全注解项目(一对一,一对多,多对多),hibernate的注解配置及映射关系
将spring的多对多映射包含的增删改差,是目前主流的编程思想
hibernate 映射关系简单实例 、一对一 、一对多、多对一 、多对多
该资源总包括SSH框架整合中hibernate框架所需要的配置文件: (1)hibernate.cfg.xml (2)在JavaBean所在的包下映射的配置文件
详细概述了Hibernate(ORM原理,核心配置,映射配置,一对一,一对多,多对多的关联关系)
主要介绍了Java的Hibernate框架中的多对一和一对多映射,Hibernate是Java的SSH三大web开发框架之一,需要的朋友可以参考下
Hibernate教程PPT;Hibernate教程 SSH ORM 对象-关系映射 HQL查询;Hibernate教程 SSH ORM 对象-关系映射 HQL查询
12.4.5 多对一单向关联的annotation注解实现538 12.4.6 一对多双向关联的annotation注解实现540 12.4.7 一对多双向自身关联的annotation注解实现542 12.4.8 多对多单向关联的annotation注解实现543 12.4.9 多对多...
6.配置商品到商品分类的多对一单向关联关系 7.配置会员到会员级别的多对一单向关联关系 8.配置会员到订单的一对多双向关联关系 9.配置会员到留言的一对多单向关联关系 10.配置管理员到留言的一对多单向关联关系 11....
ssh集成的小例子 涉及到Hibernate的关系映射,和增删改查的一些方法 (应用了MyEclipse 和SQL Server 2005)
4.4 Hibernate映射建表 4.5 配置Spring(AOP) 4.6 配置Spring(IOC) 4.7 大致分析业务逻辑定义部分Dao实现 4.8 测试Dao实现 4.9 分析JSP中要实现的功能在实体中建立实体方法 4.10 建立Struts2映射路径 4.11 分析...
SSH2(Spring + Struts2 + Hibernate)是一个流行的Java Web开发框架组合,用于构建企业级Web应用程序。Spring作为轻量级的控制反转(IoC)和面向切面编程(AOP)的容器框架,提供了依赖注入和事务管理等核心功能;...
SSH从头到尾都是围绕着一个中心建立的:面向对象。 Hibernate是作为一种对象持久化手段而存在的。所谓的O/R MAPPING其实就是持久化。因为对象与关系只不过是一个个体与集合的关系,本质上并不存在冲突。不需要...
Tfile的Hibernate映射文件Tfile.hbm.xml放在Tfile .java类文件的相同目录下: 代码 2 领域对象映射文件 1. 2. !DOCTYPE hibernate-mapping PUBLIC 3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4. ...
s2sh博客项目,JSP采用JSTL,struts标签包含源码与程序截图,采用Junite进行单元测试,后台包含博文管理,博文分类管理,用户管理...扩展性良好,可自定义添加自己的模块(注:看hibernate映射文件就知道数据库的结构)
教程视频:Hibernate是一个开放源代码的对象关系映射框架