Hibernate可以以面向对象的方式进行数据库访问,既然是面向对象,我们知道在客观世界中,对象不会孤立的存在,在Hibernate中,Hibernate把这种对象与对象之间的联系称为关联关系,如果在我们设计实体类的时候,可以良好的映射这些关联关系,便可以大大简化持久层数据的访问
关联关系分为两类:
单向关系:假如学生,老师这个例子,单向关系就是指只能从老师可以访问学生,或者只能从学生访问老师
双向关系:还是上面的例子,双向关系是指 既能从老师访问学生,又能从学生访问老师
单向关系中具体的还有: 双向关系中具体的有:
1 -> 1 1 <-> 1
1 -> N 1 <-> N
N -> N N <-> N
N -> 1
(一) 【单向】N -> 1
常见的多对一关系,是父子关系。父类不能访问子类,而其子类s都可以访问父类,在生活中,例子就是:我所住的这一栋楼对应着一个大庆路XX号地址。我们可以从这栋楼中任意一个用户来寻找到这个具体地址,而告诉你一个地址,你却不知道有哪用户。
Hibernate为了支持这种关系映射,程序应该N持久化类一端增加一个属性,该属性引用1持久类一段。
- 无连接表的 N -> 1关联
配置关联关系的两种方式:
1。使用注解(未完成)
对于N -> 1关联,不论是单向关联,还是多向关联,都需要在N的一端使用@ManyToOne修饰代表关联实体的属性
具体的以后补充..
2。使用*.hbm.xml(重点)
N的一端的配置文件
<class name="domain.Person" table="PERSON"> <id name="id"> <column name="ID"></column> <generator class="increment"></generator> </id> <property name="name"> <column name="NAME"></column> </property> <many-to-one name="address" column="ADDRESS_ID" class="domain.Address" cascade="save-update"></many-to-one> </class>
- 有连接表的N -> 1关联
配置关联关系的方式:
1。使用注解
(二) 【单向】1 -> 1关联
- 无连接表的关联
同单向N -> 1相似,一方可以直接访问另一端
配置关联关系的两种方式:
1。使用*.hbm.xml(重点)
- 有连接表的关联
配置关联关系的方式:
1。使用注解
(三) 【单向】1 -> N关联
单向1 -> N关联,1的持久化类里需要集合属性
public class Person implements Serializable{ private Integer id; private String name; private Set<Address> addresses; ..... } ---1 -> N(从一个人身上可以知道了他多个住址,而只找到住址,住址不会告诉你这是谁住的)---- public class Address implements Serializable { private Integer id; private String place; ... }
- 无连接表的关联(外键表示关联关系)
配置关联关系的两种方式:
1。使用*.hbm.xml(重点)
(1)*.hbm.xml中核心配置
<set name="addresses" cascade="save-update" > <!-- 外键字段名 --> <key column="personId"></key> <one-to-many class="domain.Address" /> </set>
(2)创建了外键来维护关联关系
从数据库查看Address表的结构:
2。使用注解
- 有连接表的关联(第三方表维护关联关系)
配置关联关系的方式:
1。使用*.hbm.xml(重点)
(1)*.hbm.xml中核心配置
<set name="addresses" cascade="save-update" table="person_address" > <!-- 外键表主键为这两个外键id列的组合 --> <key column="personId"></key> <!-- unique的目的为防止多对一的出现,确保是单向的一对多 --> <many-to-many class="domain.Address" column="adresssId" unique="true" /> </set>
(2)创建了第三方表的方式维护关联关系
在数据库查看第三方表person_address:
2。使用注解
(四) 【双向】1 <-> N关联
单向1 <-> N关联,1的持久化类里需要集合属性,N的持久化类需要一个1的引用变量
- 无连接表的关联
配置关联关系的两种方式:
1。使用*.hbm.xml(重点)
(1.1)对于1的一端*.hbm.xml采用的配置文件
<!-- 一对多,使用集合 --> <set name="addresses" cascade="save-update"> <key column="personId"></key> <one-to-many class="domain.Address"/> </set>
(1.2)对于N的一端*.hbm.xml采用的配置文件
<many-to-one name="person" class="domain.Person" column="personId" cascade="save-update"></many-to-one>
(2) 查看两张表的数据库中的结构
2。适用注解
- 有连接表的关联
配置关联关系的方式:
1。使用*.hbm.xml(重点)
(1.1)对于1的一端*.hbm.xml采用的配置文件
<set name="addresses" cascade="save-update" table="person_address"> <key column="personId"></key> <many-to-many class="domain.Address" column="addressId"/> </set>
(1.2)对于N的一端*.hbm.xml采用的配置文件
<!-- join元素强制使用连接表 --> <join table="person_address"> <key column="addressId"></key> <many-to-one name="person" class="domain.Person" column="personId" cascade="save-update"></many-to-one> </join>
(2) 查看两张表的数据库中的结构
2。使用注解