hibernate一对多关联映射
一对多关联映射
映射原理
一对多关联映射和多对一关联映射的映射原理是一致的,都是在多的一端加入一个外键,指向一的一端。关联关系都是由多端维护,只是在写映射时发生了变化。
多对一和一对多的区别
多对一和一对多的区别在于维护的关系不同:
(1)多对一:多端维护一端的关系,在加载多端时,可以将一端加载上来。
(2)一对多:一端维护多端的关系,在加载一端时,可以将多端加载上来。
分类
一、一对多单向关联映射
从对象模型中,我们可以看出,Group持有User的一个引用。由于是单向关联,所以数据在加载Group时,会把User加载上来,但是User并不知道Group的存在。
我们先看一下Group和User的实体,以及映射文件。
Group
public class Group {
private int id;
private String name;
private Set users;
...
}
User
public class User {
private int id;
private String name;
...
}
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
public class Group {
private int id;
private String name;
private Set users;
...
}
User
public class User {
private int id;
private String name;
private Group 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属性,只影响数据的存储,也就是持久化。
目的:
一对多双向关联映射的目的主要是为了解决一对多单向关联的缺陷而不是需求驱动的。
最新文章
- 剑指Offer-【面试题02:实现Singleton 模式——七种实现方式】
- 【51Nod 1622】【算法马拉松 19C】集合对
- 轻量级Lua IDE ZeroBrane Studio 的使用技巧和汉化
- 实战Django:简易博客Part1
- WPF解析PDF为图片
- android 开发 实现自动安装
- 怎么创建MongoDB数据库
- Yii学习系列:Yii视频讲义——前篇(转)
- [RxJS] Transformation operators: debounce and debounceTime
- 阻塞机制下的recv小结
- C语言转义字符相关知识
- 让IE支持CSS3圆角的方法
- 三、数据API-3
- 存储过程中拼接sql并且参数化
- matlab多个曲面如何画在一个坐标系中的疑问
- InsertSort
- ansible系列5-开启加速 Ansible 执行速度的功能
- happens-before俗解
- PowerShell “execution of scripts is disabled on this system.”
- Ubuntu软件包管理器
热门文章
- Box-shadow制作漂亮的外阴影输入框
- oa_mvc_easyui_后台布局(3)
- 100、神器的 routing mesh (Swarm07)
- 26 Python模块之paramiko
- SpringBoot + Vue + nginx项目部署(零基础带你部署)
- Vue中自定义指令的使用方法!
- echarts属性的设置
- 部署 12306 github 项目
- java笔记web
- window.location.href 与 window.location.href 的区别