背景:
公民和公民的身份证,是一个一对一的例子,一个公民只有一个身份证。
这个是基于主键的,基于外键的映射在:http://blog.csdn.net/nthack5730/article/details/45336457
场景准备:
实体类:Person.java、IdCard.java
Person.java
package h_hbm_oneToOne2;
public class Person {
private Integer id;
private String name;
private IdCard idCard;//关联的身份证
public Integer getId() {
return id;
}
public void setId(Integer 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;
}
}
IdCard.java
package h_hbm_oneToOne2;
public class IdCard {
private Integer id;
private String number;
private Person person;//不要初始化,初始化会使对象处于临时状态,会使保存的时候抛异常,关联的人的对象
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
}
IdCard.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- This mapping demonstrates -->
<!-- 告诉hibernate需要找哪个表 -->
<hibernate-mapping package="h_hbm_oneToOne2">
<!-- User表对应的映射关系 -->
<class name="IdCard" table="idCard">
<id name="id">
<generator class="native" />
</id>
<property column="number" name="number" type="string" />
<!--
person属性:Person类型
表达的是本类与IdCard的一对一关系
采用基于主键的一对一映射的方式
本方无外键方
property-ref:写的是对方映射中外键列对应的属性名,也就是Person类下的idCard属性名
-->
<one-to-one name="person" class="Person"/>
</class>
</hibernate-mapping>
Person.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- This mapping demonstrates -->
<!-- 告诉hibernate需要找哪个表 -->
<hibernate-mapping package="h_hbm_oneToOne2">
<!-- User表对应的映射关系 -->
<class name="Person" table="person">
<id name="id">
<!--
当使用基于主键的一对一映射时,有外键方的主键生成策略一定要是foreign
参数property:生成主键值时所根据的对象【一对一时关联的对方】
-->
<generator class="foreign">
<param name="property">idCard</param>
</generator>
</id>
<property column="name" name="name" type="string" />
<!--
IdCard属性:IdCard类型
表达的是本类与IdCard的一对一关系
采用基于主键的一对一映射的方式
本方有外键
-->
<one-to-one name="idCard" class="IdCard" constrained="true"></one-to-one>
</class>
</hibernate-mapping>
测试代码:
App.java
package h_hbm_oneToOne2;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.junit.Test;
import cn.marer.model.HibernateUtils;
public class APP {
private static SessionFactory sessionfactory = HibernateUtils.getSessionFactory();
@Test
public void testSave(){
Session session = sessionfactory.openSession();
//开启事务
session.beginTransaction();
//构建对象
Person person = new Person();
person.setName("张三");
IdCard id = new IdCard();
id.setNumber("123456");
person.setIdCard(id);
// session.save(id);
session.save(person);
//提交事务
session.getTransaction().commit();
session.close();
}
@Test
public void testGet(){
Session session = sessionfactory.openSession();
//开启事务
session.beginTransaction();
//获取一方
// Person person= (Person) session.get(Person.class, 1);
// System.out.println(person.getName()+"---->" + person.getIdCard());
IdCard id = (IdCard) session.get(IdCard.class, 1);
System.out.println(id.getNumber() + "---->" + id.getPerson().getName());
//提交事务
session.getTransaction().commit();
session.close();
}
// 解除关联关系
@Test
public void testRemoveRelation(){
Session session = sessionfactory.openSession();
// 开启事务
session.beginTransaction();
// 从无外键方解除关联关系不可以
IdCard id = (IdCard) session.get(IdCard.class, 1);
id.setPerson(null);
// 基于主键的一对一映射,从有外键方解除关联关系,不可以。因为主键不能为空。
// Person person = (Person) session.get(Person.class, 1);
// person.setIdCard(null);
//提交事务
session.getTransaction().commit();
session.close();
}
// 删除对对方的影响
@Test
public void testDelte(){
Session session = sessionfactory.openSession();
// 开启事务
session.beginTransaction();
// 会报异常
// IdCard id = (IdCard) session.get(IdCard.class, 1);
// session.delete(id);
// 如果没有关联的对方,能删除
// 如果有关联的对方:因为会直接执行删除自己,所以无外键方会有异常,有外键方没有异常。
Person person = (Person) session.get(Person.class, 1);
session.delete(person);
// 有外键方能维护关联关系,从无外键方不能维护关联关系
//提交事务
session.getTransaction().commit();
session.close();
}
}