背景:
公民和公民的身份证,是一个一对一的例子,一个公民只有一个身份证。
场景准备:
实体类:Person.java、IdCard.java
实体类以及映射文件代码:
Person.java
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;
}
}
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_oneToOne">
<!-- User表对应的映射关系 -->
<class name="Person" table="person">
<id name="id">
<generator class="native" />
</id>
<property column="name" name="name" type="string" />
<!--
IdCard属性:IdCard类型
表达的是本类与IdCard的一对一关系
采用基于外键的一对一映射的方式
-->
<many-to-one name="idCard" class="IdCard" column="idCardId" unique="true" cascade="all">
</many-to-one>
</class>
</hibernate-mapping>
IdCard.java
package h_hbm_oneToOne;
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_oneToOne">
<!-- 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" property-ref="idCard">
</one-to-one>
</class>
</hibernate-mapping>
测试类:APP.java
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();
}
}