我是如何学习Hibernate的(五)

前述

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package com.hibernate;
// 多端:User类,省略不重要的包和get、set方法
@Entity
@Table(name="t_user")
public class User {
private int id;
private String name;
private Group group;

@ManyToOne
public Group getGroup() {
return group;
}
@Id
@GeneratedValue
public int getId() {
return id;
}
}

XML主要配置:
<hibernate-mapping>
<class name="com.hibernate.User" table="t_user">
<id name="id">
<generator class="native"></generator>
</id>

<property name="name"></property>
<many-to-one name="group" column="groupId" />
</class>

</hibernate-mapping>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.hibernate;
// 一端:Group类,省略不重要的包和get、set方法
@Entity
@Table(name="t_group")
public class Group {
private int id;
private String name;
@Id
@GeneratedValue
public int getId() {
return id;
}
}

XML主要配置:
<class name="com.hibernate.Group" table="t_group">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<class>

多对一总结

  • 只需要在多端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的语句。