Hibernate将表之间的关系映射成对象之间的关系
单向关系
1,1--1 (外键一对一,主键一对一)
2,1--N
3,N--1
4,N--N
双向关系
1,1--1
2,1--N(N--1)
3,N--N
(1) 1--1( 单向 外键一对一)
基于外键关联的单向一对一关联 和单向多对一关联 几乎是一样的。唯一的不同就是单向一对一关联中的外键字段具有唯一性约束。
第一步:// 数据库中创建表 表的关系映射
create table Person ( personId bigint not null primary key, addressId bigint not null unique )
create table Address ( addressId bigint not null primary key )
第二步:// 创建类, 对象的关系映射
// 人员类
public class Person
{
private int id;
private Address address; // 包含了对方的引用
}
//地址类
public class Address{
private int id;
}
第三步:xml的配置
<class name="Person">
<id name="id" column="personId">
<generator class="native"/>
</id>
<many-to-one name="address" --本类中的属性名
column="addressId" --本类对应表中的列名
class = "Address" --本类所关联对方的类
unique="true" --可以对对方的引用进行唯一性约束(一对一的关系),也可以不进行唯一性约束(对象之间多对一的关系)
cascade = "all" -- 表明操作是否从父对象级联到被操作的对象
not-null="true"/> -- 必须加上, 保证两个表的关系
</class>
<class name="Address">
<id name="id" column="addressId">
<generator class="native"/>
</id>
</class>
第四步: 创建对象,保存到数据库
// 先创建被引用的对象
Address address = new Address();
// 创建引用对象,并给被引用的对象赋值
Person person = new Person();
person.address = address;
// 保存对象
session.save(address);
session.save(person );
(2)1--1( 双向 外键一对一)
第一步:表的结构和【(1)单向 1--1(外键一对一)】的表结构是没有变化
第二步: 只是再Address中增加了Person的引用
// 人员类
public class Person
{
private int id;
private Address address; // 包含了对方的引用
}
//地址类
public class Address{
private int id;
// 增加了person对象的引用
private Person person;
}
第三步:xml的配置
<class name="Person">
<id name="id" column="personId">
<generator class="native"/>
</id>
<many-to-one name="address" --本类中的属性名
column="addressId" --本类对应表中的列名
class = "Address" --本类所关联对方的类
unique="true" --可以对对方的引用进行唯一性约束(一对一的关系),也可以不进行唯一性约束(对象之间多对一的关系)
cascade = "all" -- 表明操作是否从父对象级联到被操作的对象
not-null="true"/> -- 必须加上, 保证两个表的关系
</class>
<class name="Address">
<id name="id" column="addressId">
<generator class="native"/>
</id>
-- 增加了以下的xml配置
<one-to-one name="person" // 在本类中的属性名字
class = "Person" // 被引用对象的类名
property-ref="address"/> // 关联类的属性名和本类的主键相对应
</class>
(3)1--1(单向 共享主键关联)
第一步:表的结构 :
create table Person ( personId bigint not null primary key )
create table Address ( addressId bigint not null primary key )
第二步:类的创建 对象之间关系映射
public class Person{
private int personId;
}
public class Address{
private int addressId ;
private Person person; // 在表中没有映射的外键
}
第三步:xml配置
<class name="Person">
<id name="id" column="personId">
<generator class="native"/>
</id>
</class>
<class name="Address">
<id name="id" column="addressId ">
<generator class="foreign">
<param name="property">person</param>
</generator>
</id>
<one-to-one name="person" constrained="true" -- 取值必须从外键中取 (必须加上)
class="Person " cascade="true" />
</class>
第四步:创建对象, 保存到数据库
Person person = new Person(); //创建被依赖的对象
Address address = new Address(); // 创建依赖对象
address.setPerson(person);
session.save(address ); // 保存依赖对象
(4)1--1(双向 共享主键关联)
第一步:表的结构 : 数据库和(3)是一样的
create table Person ( personId bigint not null primary key )
create table Address ( addressId bigint not null primary key )
第二步:类的创建 对象之间关系映射
public class Person{
private int personId;
private Address address; // 增加了address属性,但是在表中是没有映射字段的
}
public class Address{
private int addressId ;
private Person person; // 在表中没有映射的外键
}
第三步:xml的配置
<class name="Person">
<id name="id" column="personId">
<generator class="native"/>
</id>
<one-to-one name="address" class="Address " cascade="true"/> //增加了one-to-one的配置
</class>
<class name="Address">
<id name="id" column="addressId ">
<generator class="foreign">
<param name="property">person</param>
</generator>
</id>
<one-to-one name="person" constrained="true" -- 取值必须从外键中取 (必须加上)
class="Person " cascade="true" />
</class>
第四步:创建对象保存数据库 保存对象书顺序是没有改变的 (要先保存自动生成主键的对象)
Person person = new Person(); //创建被依赖的对象
Address address = new Address(); // 创建依赖对象
address.setPerson(person);
session.save(address ); // 保存依赖对象