基于主键关联的单向一对一关联通常使用一个特定的id生成器。
单向关联示例
Person类
public class Person {
private int id;
private String name;
private int age;
private IdCard idCard;
//省略get/set方法
}
IdCard类
public class IdCard {
private int id;
private String code;
//省略get/set方法
}
Person.hbm.xml配置文件
<hibernate-mapping package="com.test.pojo">
<class name="Person">
<id name="id">
<!-- foreign表示引用外键 -->
<generator class="foreign">
<!-- 引用idCard属性所对应的主键 -->
<param name="property">idCard</param>
</generator>
</id>
<property name="name" />
<property name="age"/>
<one-to-one name="idCard" constrained="true"
cascade="save-update"/>
</class>
</hibernate-mapping>
IdCard.hbm.xml配置文件
<hibernate-mapping package="com.test.pojo">
<class name="IdCard">
<id name="id">
<generator class="native"></generator>
</id>
<property name="code" />
</class>
</hibernate-mapping>
测试类
public class HibernateTest {
@Test
public void testCreateDB(){
Configuration cfg=new Configuration().configure();
SchemaExport se=new SchemaExport(cfg);
//第一个参数表示是否生成ddl脚本,第二个参数表示是否执行到数据库中
se.create(true, true);
}
/**
* 保存数据
*/
@Test
public void save(){
Session session=null;
Transaction tx=null;
try{
session=HibernateUtil.getSession();
tx=session.beginTransaction();
IdCard id1=new IdCard();
id1.setCode("124234545656767");
IdCard id2=new IdCard();
id2.setCode("120343435454556");
Person person1=new Person();
person1.setName("孙悟空");
person1.setAge(500);
person1.setIdCard(id1);
Person per=new Person();
per.setName("唐僧");
per.setAge(30);
per.setIdCard(id2);
Person per2=new Person();
per2.setName("白骨精");
per2.setAge(500);
per2.setIdCard(id1);
session.save(person1);
session.save(per);
//保存会出错
//session.save(per2);
tx.commit();
}catch(Exception e){
if(tx!=null)
tx.rollback();
e.printStackTrace();
}finally{
HibernateUtil.closeSession();
}
}
}
执行testCreateDB控制台打印信息如下:
alter table Person
drop
foreign key FK_3blpx78aucutb5umaelf9essh
drop table if exists IdCard
drop table if exists Person
create table IdCard (
id integer not null auto_increment,
code varchar(255),
primary key (id)
)
create table Person (
id integer not null,
name varchar(255),
age integer,
primary key (id)
)
alter table Person
add constraint FK_3blpx78aucutb5umaelf9essh
foreign key (id)
references IdCard (id)
执行save控制台打印信息如下:
Hibernate:
insert
into
IdCard
(code)
values
(?)
Hibernate:
insert
into
Person
(name, age, id)
values
(?, ?, ?)
Hibernate:
insert
into
IdCard
(code)
values
(?)
Hibernate:
insert
into
Person
(name, age, id)
values
(?, ?, ?)
数据库表信息如下:
双向关联示例(只展示与单向关联示例不同的地方)
IdCard类
public class IdCard {
private int id;
private String code;
private Person person;
//省略get/set方法
}
IdCard.hbm.xml配置文件
<hibernate-mapping package="com.test.pojo">
<class name="IdCard">
<id name="id">
<generator class="native"></generator>
</id>
<property name="code" />
<one-to-one name="person" />
</class>
</hibernate-mapping>
测试类获取数据
@Test
public void testGet(){
Session session=null;
Transaction tx=null;
try{
session=HibernateUtil.getSession();
tx=session.beginTransaction();
Person person=(Person) session.get(Person.class, 1);
System.out.println("personName:"+person.getName()+"----idCard:"+person.getIdCard().getCode());
System.out.println("=============");
IdCard idcard=(IdCard) session.get(IdCard.class, 2);
System.out.println("personName:"+idcard.getPerson().getName()+"----idCard:"+idcard.getCode());
tx.commit();
}catch(Exception e){
if(tx!=null)
tx.rollback();
e.printStackTrace();
}finally{
HibernateUtil.closeSession();
}
}
执行testGet控制台打印信息如下:
Hibernate:
select
person0_.id as id1_1_0_,
person0_.name as name2_1_0_,
person0_.age as age3_1_0_
from
Person person0_
where
person0_.id=?
Hibernate:
select
idcard0_.id as id1_0_0_,
idcard0_.code as code2_0_0_,
person1_.id as id1_1_1_,
person1_.name as name2_1_1_,
person1_.age as age3_1_1_
from
IdCard idcard0_
left outer join
Person person1_
on idcard0_.id=person1_.id
where
idcard0_.id=?
personName:孙悟空----idCard:124234545656767
=============
Hibernate:
select
idcard0_.id as id1_0_0_,
idcard0_.code as code2_0_0_,
person1_.id as id1_1_1_,
person1_.name as name2_1_1_,
person1_.age as age3_1_1_
from
IdCard idcard0_
left outer join
Person person1_
on idcard0_.id=person1_.id
where
idcard0_.id=?
personName:唐僧----idCard:120343435454556