要实现Hibernate中一对一的数据关联关系有两种方式:
1, 主键关联,即两个表共享一个主键
2,唯一外键关联,即在一个表中记录一个外键字段,参照另一张表的主键
一、主键关联
1. 首先创建用户表(person) 和身份证表(idcard),二者是一对一的关系
----用户表----
create table Person(
id varchar2(32) primary key,
name varchar2(32) not null,
age number(3) not null
)
-----身份证表-----
create table idcard(
id varchar2(32) ,
serial VARCHAR(18) NOT NULL , //身份证号码
expiry number(3), //使用年限
foreign key(id) references person(id) on delete cascade
)
2,创建两个表对应的pojo
public class Person {
//主键
private String id = "";
//用户名
private String name = "";
//年龄
private int age = 0;
//身份证对象
private Idcard idcard = null;
..............
}
public class Idcard {
//主键
private String id = "";
//号码
private String serial = "";
//使用年限
private int expiry = 0;
//用户对象
private Person Person = null;
............
}
3,分别建立两张表的映射关系
Person.hbm.xml
<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="包名">
<class name="Person" table="Person">
<id name="id" column="id" type="string">
<generator class="uuid.hex"></generator>
</id>
<property name="name" column="name" type="string"/>
<property name="age" column="age" type="int"/>
<one-to-one name="idcard" class="包名.Idcard" cascade="all" outer-join="true"/>
</class>
</hibernate-mapping>
Idcard.hbm.xml
<?xml version="1.0" encoding='UTF-8'?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > <hibernate-mapping package="包名"> <class name="Idcard" table="Idcard"> <id name="id" column="id"> <generator class="foreign"> <param name="property">person</param> </generator> </id> <property name="serial" column="serial" type="string"/> <property name="expiry" column="expiry" type="int"/> <one-to-one name="person" class="Person" constrained="true"/> </class> </hibernate-mapping>
二、唯一外键关联
1. 首先创建用户表(person) 和身份证表(idcard),二者是一对一的关系
----用户表----
create table person(
pid varchar2(32) primary key,
name varchar2(32) not null,
age number(3) not null
)
----身份证表----
create table idcard(
id varchar2(32) ,
serial VARCHAR(18) NOT NULL ,
expiry number(3),
pid varchar2(32) ,
foreign key(id) references person(pid) on delete cascade
)
2.创建两张表对应的pojo
public class Person {
//主键
private String pid = "";
//用户名
private String name = "";
//年龄
private int age = 0;
//身份证对象
private Idcard idcard = null;
..............
}
public class Idcard {
//主键
private String id = "";
//号码
private String serial = "";
//使用年限
private int expiry = 0;
//用户对象
private Person person = null;
............
}
3.分别建立两张表的映射关系
Person.hbm.xml
<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="包名">
<class name="person" table="person">
<id name="pid" column="pid" type="string">
<generator class="uuid.hex"/>
</id>
<property name="name" column="name" type="string"/>
<property name="age" column="age" type="int"/>
<one-to-one name="idcard" class="Idcard" property-ref="person"/>
</class>
</hibernate-mapping>
Idcard.hbm.xml
<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="包名">
<class name="Idcard" table="idcard">
<id name="id" column="id" type="string">
<generator class="uuid.hex"/>
</id>
<property name="serial" column="serial" type="string"/>
<property name="expiry" column="expiry" type="int"/>
<many-to-one name="person" class="Person" column="pid"/>
</class>
</hibernate-mapping>