hibernate关联关系的映射
2012-07-26 11:46
288 查看
以简单的两个类为例:
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)
?
?
2、一对多单向关联(几乎不用)
实体模型:
bean.User(int id, String name)
bean.Group(int id, String name, Set users)
?
?
为Group加入集合也可以使用List(<list>),注意不能指定类型是具体的HashSet或ArrayList,只能是接口Set或List。
集合标签可以使用order-by属性指定排序:
?
3、双向关联
实体模型:
bean.User(int id, String name, Group group)
bean.Group(int id, String name, Set users)
?
?
双向关联中,为<set>加入”inverse=true”可以反转维护关系:Hibernate将放弃从一的一端维护。意思就是user和group的关系必须使用user维护,操作group时Hibernate将不维护这个关系。
?
操作group的示例:
?
没有配置inverse=”true”时,Hibernate输出了添加user和group,并更新user的语句:
?
因为外键列在t_user表中,从group端维护需要操作多表,所以从user端维护关系更加合理,效率也更高。上面的代码输出两条SQL语句,插入数据的同时也维护了关系:
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)
?
?
主键关联由Hibernate维护,不依赖数据库。如果需要在数据库端也生成外键约束,可以使用constrained:
?
1.2、主键双向关联
实体模型:
bean.User(int id, String name, Group group)
bean.Group(int id, String name, User user)
?
?
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)
?
?
2.2、唯一外键双向关联
实体模型:
bean.User(int id, String name, Group group)
bean.Group(int id, String name, User user)
?
?
关系模型:
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、多对多单向关联
实体模型:
bean.User(int id, String name, Set groups)
bean.Group(int id, String name, Set users)
?
?
多对多的双向关联同样可以在不想要维护关系的一端的<set>里设置inverse=”true”;但是必须有一端可以维护,也就是说只可以设置一个。
Technorati 标签: Java,Hibernate,学习笔记,映射,关联映射,Mapping
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)
?
实体模型:
bean.User(int id, String name)
bean.Group(int id, String name, Set users)
?
集合标签可以使用order-by属性指定排序:
?
实体模型:
bean.User(int id, String name, Group group)
bean.Group(int id, String name, Set users)
?
?
?
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端维护关系:
?
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)
?
?
实体模型:
bean.User(int id, String name, Group group)
bean.Group(int id, String name, User user)
?
唯一外键关联生成的关系模型:
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)
?
实体模型:
bean.User(int id, String name, Group group)
bean.Group(int id, String name, User user)
?
三、多对多关联映射(每个用户拥有多个组,每个组也有多个用户)
多对多关联映射关系使用中间表表示。导出关系模型时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)
?
实体模型:
bean.User(int id, String name, Set groups)
bean.Group(int id, String name, Set users)
?
Technorati 标签: Java,Hibernate,学习笔记,映射,关联映射,Mapping
相关文章推荐
- Hibernate学习4—关联关系一对多映射2
- SSH框架之Hibernate的多对多映射、多对多关联关系维护(inverse)
- Hibernate关联关系映射
- Hibernate关联关系映射-----单向多对一映射配置
- Hibernate关联关系配置-----双向一对一映射配置
- Hibernate的关联关系映射
- 【Hibernate — 映射实体关联关系】
- Hibernate_映射_关联关系_cascade属性、单向关联
- Hibernate关联关系映射(一对一关联)
- Hibernate -- 映射实体关联关系(一对多关联关系)
- Hibernate关联关系映射_单边一对多
- Hibernate关联关系映射_多对一双边
- Hibernate框架基础——多对多关联关系映射
- Hibernate学习---关联关系映射
- (转)Hibernate框架基础——多对多关联关系映射
- hibernate关联关系中的集合映射的比较
- Hibernate 映射文件中多种关联关系的实现
- Hibernate之关联关系映射(一对一主键映射和一对一外键映射)
- 码农小汪-Hibernate学习4-关联关系映射many-to-one,many-to-one,one-to-many
- Hibernate 关联关系映射 -双向关联