1、需求:新增一个用户时,同时增加身份证信息。
2、数据库设计:
3、说明:以上是基于外键的映射关系,将用户表主键 user_id作为身份证表的外键字段关联起来,作为单独的外键列,保存在数据库中,类似于一对多的映射关系,多方维护一方的主键作为外键。所以基于外键映射方式的一对一关系实际上是特殊的一对多关系映射,只是有一个特殊条件,外键必须唯一。
4、代码:
User.java:
package cn.hxjrjt.domain;
public class User {
private int userId;
private String userName;
// 用户与身份证信息, 一对一关系
private IdentityCard identityCard;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public IdentityCard getIdentityCard() {
return identityCard;
}
public void setIdentityCard(IdentityCard identityCard) {
this.identityCard = identityCard;
}
}
IdentityCard.java:
package cn.hxjrjt.domain;
public class IdentityCard {
private int idCardID;
private String idCardNum;
private String idCardPlace;
private User user;
public int getIdCardID() {
return idCardID;
}
public void setIdCardID(int idCardID) {
this.idCardID = idCardID;
}
public String getIdCardNum() {
return idCardNum;
}
public void setIdCardNum(String idCardNum) {
this.idCardNum = idCardNum;
}
public String getIdCardPlace() {
return idCardPlace;
}
public void setIdCardPlace(String idCardPlace) {
this.idCardPlace = idCardPlace;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
User.hbm.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.hxjrjt.domain">
<class name="User" table="t_user">
<id name="userId" column="user_id">
<generator class="native"></generator>
</id>
<property name="userName" column="user_name" length="20"></property>
<!-- 配置一对一外键关系的关联 -->
<one-to-one name="identityCard" class="IdentityCard" property-ref="user"></one-to-one>
</class>
</hibernate-mapping>
IdentityCard.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">
<hibernate-mapping package="cn.hxjrjt.domain">
<class name="IdentityCard" table="t_IdCard">
<id name="idCardID" column="idcard_id">
<generator class="native"></generator>
<property name="idCardNum" column="idcard_num" length="20"></property>
<property name="idCardPlace" column="idcard_place" length="20"></property>
<!-- 一对一映射,有外键方 unique="true" 给外键字段添加唯一约束 -->
<many-to-one name="user" unique="true" column="user_id" class="User" cascade="save-update"></many-to-one>
</class>
</hibernate-mapping>
OneToOneTest.java:
package cn.hxjrjt.demo;
import org.hibernate.Session;
import cn.hxjrjt.domain.IdentityCard;
import cn.hxjrjt.domain.User;
import cn.hxjrjt.utils.HibernateUtils;
public class OneToOneTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
getSave();
}
public static void getSave() {
Session session = HibernateUtils.getCurrentSession();
session.beginTransaction();
// 用户
User user = new User();
user.setUserName("cc");
// 身份证
IdentityCard idCard = new IdentityCard();
idCard.setIdCardNum("34250119991010101X");
idCard.setIdCardPlace("IdCardPlace");
// 关系
idCard.setUser(user);
// ----保存----
session.save(idCard);
session.getTransaction().commit();
}
}