双向一对一关联关系:
例子: 一个人(Person)唯一拥有一张身份证,一张身份证(IDCard) 只能属于一个人
双向一对一 与 双向多对一 很类似,可以看出特殊的多对一,只不过多的一方加上一个约束 unique="true"
1)实体类
Person.java
package com.lcy.model;
public class Person {
private int id;
private String name;
private IDCard idCard;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public IDCard getIdCard() {
return idCard;
}
public void setIdCard(IDCard idCard) {
this.idCard = idCard;
}
public Person(String name) {
this.name = name;
}
public Person() {
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + "]";
}
}
IDCard.java
package com.lcy.model;
public class IDCard {
private int id;
private int number;
private Person person;
public IDCard() {
}
public IDCard(int number) {
this.number = number;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
@Override
public String toString() {
return "IDCard [id=" + id + ", number=" + number + "]";
}
}
2)关联关系
Person.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.lcy.model">
<class name="Person" table="t_person">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<many-to-one name="idCard" class="IDCard">
<column name="idNumber" unique="true" />
</many-to-one>
</class>
</hibernate-mapping>
PS:需要在多的一方设置 unique="true"
IDCard.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.lcy.model">
<class name="IDCard" table="t_idcard">
<id name="id">
<generator class="native"></generator>
</id>
<property name="number" type="int"></property>
<one-to-one name="person" class="Person" property-ref="idCard"></one-to-one>
</class>
</hibernate-mapping>
PS:property-ref="idCard" 这个值是 Person 这个类中的 idCard属性
3)将映射描述文件 添加到 hibernate.cfg.xml 主配置文件中
<mapping resource="com/lcy/model/IDCard.hbm.xml" />
<mapping resource="com/lcy/model/Person.hbm.xml" />
4)编写测试
@Test
public void test(){
Person person = new Person("王保保");
IDCard idCard = new IDCard(3200103);
person.setIdCard(idCard);
idCard.setPerson(person);
session.save(person);
session.save(idCard);
}
PS:如果先保存 多的一方,再保存一的方,执行的结果表明也会多出一条 update 语句
5)打印输出的 SQL 语句
---------创建表------------
Hibernate: create table t_idcard (id integer not null auto_increment, number integer, primary key (id)) engine=InnoDB
Hibernate: create table t_person (id integer not null auto_increment, name varchar(255), idNumber integer, primary key (id)) engine=InnoDB
---------修改表结构------------
Hibernate: alter table t_person drop index UK_59gh4xpj2j5vo3vql95fwid9o
Hibernate: alter table t_person add constraint UK_59gh4xpj2j5vo3vql95fwid9o unique (idNumber)
Hibernate: alter table t_person add constraint FK8igkb0on9l0vl7qiqlakwem93 foreign key (idNumber) references t_idcard (id)
---------执行插入存在------------
Hibernate: insert into t_person (name, idNumber) values (?, ?)
Hibernate: insert into t_idcard (number) values (?)
Hibernate: update t_person set name=?, idNumber=? where id=?