前述
Hibernate中的级联关系和抓取策略是放在一起使用的,应当先搞清楚级联关系的一对一、多对一、一对多、多对多。再搞清楚抓取策略中的fetch、lazy的使用,然后再将二者结合一起使用。
多对一(重点) 、 一对一
多端维护关联关系,多端持有一个一端的引用,在多端加入一个外键,指向一端。
使用多个User对一个Group举例(Annotation版本+XML配置版本)
注意:使用Annotation配置,可以不用像以前一样配置XML文件,在hiberna.cfg.xml中需要使用:1
2<mapping class="com.hibernate.User" />
<mapping class="com.hibernate.Group" />
1 | package com.hibernate; |
1 | package com.hibernate; |
多对一总结
只需要在多端User的getGroup方法上端进行注解配置
1
2
3
4
5@ManyToOne //多对一关联 User是多的一方 Group是一的一方
@JoinColumn(name="groupid") //指定User表中生成与Group对应的字段名
public Group getGroup() {
return group;
}xml:
标签会在多端添加外键,相当于在数据库中添加外键,生成的表为:
user(id,name,groupid),t_group(id,groupname)- 属性cascade
取值all,none,save-update,delete,对象间的级联操作,只对增删改起作用.
在存储时User时,设置了cascade=”all”会自动存储相应的t_group.而不用管user关联的对象(通常情况下会优先存储关联的对象,然后再存储user)。
多对一抓取策略
- fetch取值:join select
join:底层使用迫切左外连接,lazy无效。
select:使用多条查询语句查询。 lazy取值:false、proxy、no-proxy
false:不实用懒加载,在查询的时候把所有字段全部加载到缓存中。
proxy:采用关联对象,类级别检索策略。fetch=”select” lazy=”proxy”是否延迟,取决于关联对象所设定的类级别检索策略。比如:
多端(User端):
一端(Group端):
同时查询User和Group会同时生成两条select语句。
多端(User端):
一端(Group端):
同时查询User和Group,先生成select User的语句,当使用到Group属性时,再生成select Group的语句。