Hibernate关联映射(转载)
原文:http://www.cnblogs.com/huxi/archive/2009/12/15/1624988.html
以简单的两个类为例:
User(int id, String name)
Group(int id, String name)
没有关联关系时的关系模型:
t_user(id int pk, name varchar)
t_group(id int pk, name varchar)
一、多对一和一对多关联映射(多个用户有相同的组)
这几种关联映射后的关系模型是相同的:
t_user(id int pk, name varchar, gid int fk->t_group(id))
t_group(id int pk, name varchar)
1、多对一单向关联
实体模型:
bean.User(int id, String name, Group group)
bean.Group(int id, String name)
|
1
2
3
4
5
6
7
8
9
10
|
<!-- bean/User.hbm.xml --><hibernate-mapping> <class name="bean.User" table="t_user"> <id name="id"><generator class="native"/></id> <property name="name"/> <!-- 使用<many-to-one>映射多对一关系。导出ddl时将自动生成一个外键 --> <many-to-one name="group" column="gid"/> </class></hibernate-mapping> |
|
1
2
3
4
5
6
7
8
|
<!-- bean/Group.hbm.xml --><hibernate-mapping> <class name="bean.Group" table="t_group"> <id name="id"><generator class="native"/></id> <property name="name"/> </class></hibernate-mapping> |
2、一对多单向关联(几乎不用)
实体模型:
bean.User(int id, String name)
bean.Group(int id, String name, Set users)
|
1
2
3
4
5
6
7
8
|
<!-- bean/User.hbm.xml --><hibernate-mapping> <class name="bean.User" table="t_user"> <id name="id"><generator class="native"/></id> <property name="name"/> </class></hibernate-mapping> |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<!-- bean/Group.hbm.xml --><hibernate-mapping> <class name="bean.Group" table="t_group"> <id name="id"><generator class="native"/></id> <property name="name"/> <!-- 使用<set>映射集合 --> <set name="users"> <!-- 使用<key>指定引用至自身的外键表(t_user)中的外键 --> <key column="gid"/> <!-- 使用<one-to-many>映射一对多关系 --> <one-to-many class="bean.User"/> </set> </class></hibernate-mapping> |
为Group加入集合也可以使用List(<list>),注意不能指定类型是具体的HashSet或ArrayList,只能是接口Set或List。
集合标签可以使用order-by属性指定排序:
|
1
|
<set name="users" order-by="id desc"> |
3、双向关联
实体模型:
bean.User(int id, String name, Group group)
bean.Group(int id, String name, Set users)
|
1
2
3
4
5
6
7
8
9
10
|
<!-- bean/User.hbm.xml --><hibernate-mapping> <class name="bean.User" table="t_user"> <id name="id"><generator class="native"/></id> <property name="name"/> <!-- 使用<many-to-one>映射多对一关系。导出ddl时将自动生成一个外键 --> <many-to-one name="group" column="gid"/> </class></hibernate-mapping> |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<!-- bean/Group.hbm.xml --><hibernate-mapping> <class name="bean.Group" table="t_group"> <id name="id"><generator class="native"/></id> <property name="name"/> <!-- 使用<set>映射集合 --> <set name="users"> <!-- 使用<key>指定引用至自身的外键表(t_user)中的外键 --> <key column="gid"/> <!-- 使用<one-to-many>映射一对多关系 --> <one-to-many class="bean.User"/> </set> </class></hibernate-mapping> |
双向关联中,为<set>加入”inverse=true”可以反转维护关系:Hibernate将放弃从一的一端维护。意思就是user和group的关系必须使用user维护,操作group时Hibernate将不维护这个关系。
|
1
|
<set name="users" inverse="true"> |
操作group的示例:
|
1
2
3
4
5
6
7
8
9
10
11
12
|
session.beginTransaction();User user = new User();user.setName("张三");Group group = new Group();group.setName("admin");group.setUsers(new HashSet());group.getUsers().add(user);session.save(user);session.save(group);session.getTransaction().commit(); |
没有配置inverse=”true”时,Hibernate输出了添加user和group,并更新user的语句:
Hibernate: insert into t_user (name, gid) values (?, ?)
Hibernate: insert into t_group (name) values (?)
Hibernate: update t_user set gid=? where id=?
而配置了inverse=”true”后,Hibernate仅仅输出了添加user和group的语句,并没有更新user,放弃了关系的维护:
Hibernate: insert into t_user (name, gid) values (?, ?)
Hibernate: insert into t_group (name) values (?)
此时应该从user端维护关系:
|
1
2
3
4
5
6
7
8
9
10
11
|
session.beginTransaction();Group group = new Group();group.setName("admin");User user = new User();user.setName("张三");user.setGroup(group);session.save(group);session.save(user);session.getTransaction().commit(); |
因为外键列在t_user表中,从group端维护需要操作多表,所以从user端维护关系更加合理,效率也更高。上面的代码输出两条SQL语句,插入数据的同时也维护了关系:
Hibernate: insert into t_group (name) values (?)
Hibernate: insert into t_user (name, gid) values (?, ?)
二、一对一关联映射(每个用户独有一个组)
依照映射方法不同,可分为主键关联映射和唯一外键关联映射。主键关联是维护两张表的主键一致,如有必要还可以在主键上再加上外键约束;唯一外键关联则类似于多对一关联,为表加入一个外键列,不过一对一关联会同时将这个外键加上唯一约束。
1、主键关联映射
主键关联生成的关系模型:
t_user(id int pk fk->t_group(id), name varchar)
t_group(id int pk, name varchar)
1.1、主键单向关联
实体模型:
bean.User(int id, String name, Group group)
bean.Group(int id, String name)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<!-- bean/User.hbm.xml --><hibernate-mapping> <class name="bean.User" table="t_user"> <id name="id"> <!-- 指定主键生成策略为外键 --> <generator class="foreign"> <!-- 指定要参照的属性 --> <param name="property">group</param> </generator> </id> <property name="name"/> <!-- 使用<one-to-one>映射一对一关系。 --> <one-to-one name="group"> </class></hibernate-mapping> |
|
1
2
3
4
5
6
7
8
|
<!-- bean/Group.hbm.xml --><hibernate-mapping> <class name="bean.Group" table="t_group"> <id name="id"><generator class="native"/></id> <property name="name"/> </class></hibernate-mapping> |
主键关联由Hibernate维护,不依赖数据库。如果需要在数据库端也生成外键约束,可以使用constrained:
|
1
|
<one-to-one name="group" constrained="true"/> |
1.2、主键双向关联
实体模型:
bean.User(int id, String name, Group group)
bean.Group(int id, String name, User user)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<!-- bean/User.hbm.xml --><hibernate-mapping> <class name="bean.User" table="t_user"> <id name="id"> <!-- 指定主键生成策略为外键 --> <generator class="foreign"> <!-- 指定要参照的属性 --> <param name="property">group</param> </generator> </id> <property name="name"/> <!-- 使用<one-to-one>映射一对一关系。 --> <one-to-one name="group"> </class></hibernate-mapping> |
|
1
2
3
4
5
6
7
8
9
10
|
<!-- bean/Group.hbm.xml --><hibernate-mapping> <class name="bean.Group" table="t_group"> <id name="id"><generator class="native"/></id> <property name="name"/> <!-- 使用<one-to-one>映射一对一关系 --> <one-to-one name="user"/> </class></hibernate-mapping> |
2、唯一外键关联映射
唯一外键关联生成的关系模型:
t_user(id int pk, name varchar, gid int fk->t_group(id))
t_group(id int pk, name varchar)
2.1、唯一外键单向关联
实体模型:
bean.User(int id, String name, Group group)
bean.Group(int id, String name)
|
1
2
3
4
5
6
7
8
9
10
11
12
|
<!-- bean/User.hbm.xml --><hibernate-mapping> <class name="bean.User" table="t_user"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <!-- 为<many-to-one>加上unique就变成了一对一 --> <many-to-one name="group" unique="true" column="gid"/> </class></hibernate-mapping> |
|
1
2
3
4
5
6
7
8
|
<!-- bean/Group.hbm.xml --><hibernate-mapping> <class name="bean.Group" table="t_group"> <id name="id"><generator class="native"/></id> <property name="name"/> </class></hibernate-mapping> |
2.2、唯一外键双向关联
实体模型:
bean.User(int id, String name, Group group)
bean.Group(int id, String name, User user)
|
1
2
3
4
5
6
7
8
9
10
11
12
|
<!-- bean/User.hbm.xml --><hibernate-mapping> <class name="bean.User" table="t_user"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <!-- 为<many-to-one>加上unique就变成了一对一 --> <many-to-one name="group" unique="true" column="gid"/> </class></hibernate-mapping> |
|
1
2
3
4
5
6
7
8
9
10
|
<!-- bean/Group.hbm.xml --><hibernate-mapping> <class name="bean.Group" table="t_group"> <id name="id"><generator class="native"/></id> <property name="name"/> <!-- 使用<one-to-one>映射一对一 --> <one-to-one name="user"/> </class></hibernate-mapping> |
三、多对多关联映射(每个用户拥有多个组,每个组也有多个用户)
多对多关联映射关系使用中间表表示。导出关系模型时Hibernate将自动生成复合主键以及外键约束。
关系模型:
t_user(id int pk, name varchar)
t_group(id int pk, name varchar)
t_user_group(userid int fk->t_user(id), groupid int fk->t_group(id), pk(userid, groupid))
1、多对多单向关联
实体模型:
bean.User(int id, String name, Set groups)
bean.Group(int id, String name)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<!-- bean/User.hbm.xml --><hibernate-mapping> <class name="bean.User" table="t_user"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <!-- 使用<set>映射集合,在多对多关系中,Hibernate将生成第三张表 --> <set name="groups" table="t_user_group"> <!-- 使用<key>指定引用至自身的外键表(t_user_group)中的外键 --> <key column="userid"/> <!-- 使用<many-to-many>映射多对多关系,column指定另一端在表t_user_group中的列 --> <many-to-many class="bean.Group" column="groupid"/> </set> </class></hibernate-mapping> |
|
1
2
3
4
5
6
7
8
|
<!-- bean/Group.hbm.xml --><hibernate-mapping> <class name="bean.Group" table="t_group"> <id name="id"><generator class="native"/></id> <property name="name"/> </class></hibernate-mapping> |
1、多对多单向关联
实体模型:
bean.User(int id, String name, Set groups)
bean.Group(int id, String name, Set users)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<!-- bean/User.hbm.xml --><hibernate-mapping> <class name="bean.User" table="t_user"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <!-- 使用<set>映射集合,在多对多关系中,Hibernate将生成第三张表 --> <set name="groups" table="t_user_group"> <!-- 使用<key>指定引用至自身的外键表(t_user_group)中的外键 --> <key column="userid"/> <!-- 使用<many-to-many>映射多对多关系,column指定另一端在表t_user_group中的列 --> <many-to-many class="bean.Group" column="groupid"/> </set> </class></hibernate-mapping> |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<!-- bean/Group.hbm.xml --><hibernate-mapping> <class name="bean.Group" table="t_group"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <!-- 使用<set>映射集合,在多对多关系中,Hibernate将生成第三张表 --> <set name="users" table="t_user_group"> <!-- 使用<key>指定引用至自身的外键表(t_user_group)中的外键 --> <key column="group"/> <!-- 使用<many-to-many>映射多对多关系,column指定另一端在表t_user_group中的列 --> <many-to-many class="bean.User" column="userid"/> </set> </class></hibernate-mapping> |
多对多的双向关联同样可以在不想要维护关系的一端的<set>里设置inverse=”true”;但是必须有一端可以维护,也就是说只可以设置一个。
Hibernate关联映射(转载)的更多相关文章
- Hibernate关联映射(一对多/多对多)
版权声明:翀版 https://blog.csdn.net/biggerchong/article/details/843401053. Hibernate关联映射上接Hibernate持久化类:h ...
- Hibernate关联映射关系
Hibernate关联映射关系 一.双向一对多关联映射关系:当类与类之间建立了关联,就可以方便的从一个对象导航到另一个或另一组与它关联的对象(一对多双向关联和多对一双向关联是完全一样的) 1.1创建实 ...
- Oracle primary,unique,foreign 区别,Hibernate 关联映射
Oracle primary,unique,foreign 区别 转:http://www.cnblogs.com/henw/archive/2012/08/15/2639510.html NOT N ...
- 第六章 Hibernate关联映射
第六章 hibernate关联映射一.本章知识点分为2部分:1.关联关系:单向多对一关联关系,双向一对多关联关系(含一对多关联关系),多对多关联关系2.延迟加载:类级别加载策略,一对多加载策略,多对一 ...
- 【学习笔记】Hibernate关联映射(Y2-1-6)
Hibernate关联映射 关联映射就是将关联关系映射到数据库里,在对象模型中就是一个或多个引用. 1.单向多对一关联 准备数据库 部门表和员工表 其中部门表有两列 部门编号和名称 员工表有三列 员工 ...
- 第三章Hibernate关联映射
第三章Hibernate关联映射 一.关联关系 类与类之间最普通的关系就是关联关系,而且关联是有方向的. 以部门和员工为列,一个部门下有多个员工,而一个员工只能属于一个部门,从员工到部门就是多对一关联 ...
- (转)Hibernate关联映射——对象的三种关系
http://blog.csdn.net/yerenyuan_pku/article/details/70148618 Hibernate关联映射——对象的三种关系 Hibernate框架基于ORM设 ...
- (转)Hibernate关联映射——一对多(多对一)
http://blog.csdn.net/yerenyuan_pku/article/details/70152173 Hibernate关联映射——一对多(多对一) 我们以客户(Customer)与 ...
- Java三大框架之——Hibernate关联映射与级联操作
什么是Hibernate中的关联映射? 简单来说Hibernate是ORM映射的持久层框架,全称是(Object Relational Mapping),即对象关系映射. 它将数据库中的表映射成对应的 ...
随机推荐
- SSH基本框架搭建后的简化
对于SSh框架的简化,我们可以从下面几个方面来剖析: 1.实体类entity:在这里我们需要将数据库和实体类进行关联,在简化之前,我们需要在entity包里面加入一份.xml配置文件 例如原码---- ...
- ViewPager图片轮转带点的
布局页面设置: <?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:and ...
- 同一web系统,不同端口的跨域问题
部署web系统的时候,发现了跨域问题,子系统是用Iframe嵌入到系统里面的,导致父窗口获取子系统的webService和图片时发现跨域问题,如下图所示:问题1:父窗口获取子系统的对象跨域 原因:用这 ...
- POJ 2699 The Maximum Number of Strong Kings Description
The Maximum Number of Strong Kings Description A tournament can be represented by a complete graph ...
- phpmyadmin连接,管理多个mysql服务器
方法一,修改phpMyAdmin/libraries/config.default.php 修改配置文件前,最好先备份一下,万一改错地方了,显示不了,就郁闷了. /** * allow login t ...
- 杀死你网站SEO的5个技术
胡亮亮先生(网迈SEO总监)在其微信公众帐号里发布了文章<杀死你网站SEO的5个技术>,发出来给大家分享一下: 应百度站长平台邀请,抽空把这篇文章做一些细节上的补充 ,欢迎大家关注并讨论. ...
- Spring 4 官方文档学习(十二)View技术
关键词:view technology.template.template engine.markup.内容较多,按需查用即可. 介绍 Thymeleaf Groovy Markup Template ...
- (2015秋) 作业6:(电梯系统之结对编程 I 总分=2*50 分)
电梯系统 0. 背景 南通大学钟秀校区“主教学楼” 用 2 部电梯(连地下室共9层):每到下课.上课前都特别拥挤,大家希望改进已有的电梯调度算法,满足学生和老师快速乘坐电梯的需要.因此,需要重新设计一 ...
- Android多点触控技术实战,自由地对图片进行缩放和移动
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11100327 在上一篇文章中我带着大家一起实现了Android瀑布流照片墙的效果, ...
- 1334: [Baltic2008]Elect
Description N个政党要组成一个联合内阁,每个党都有自己的席位数. 现在希望你找出一种方案,你选中的党的席位数要大于总数的一半,并且联合内阁的席位数越多越好. 对于一个联合内阁,如果某个政党 ...