hibernate中的一对一映射

来源:互联网 发布:破解会员软件 编辑:程序博客网 时间:2024/05/29 02:11

一对一约束图解

这里写图片描述

**

一 、基于外键的约束

**

**
package cn.itcast.c_one2one;

// 用户
public class User {

private int userId;private String userName;// 用户与身份证信息, 一对一关系private IdCard idCard;public IdCard getIdCard() {    return idCard;}public void setIdCard(IdCard idCard) {    this.idCard = idCard;}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;}

}

package cn.itcast.c_one2one;

// 身份证
public class IdCard {

// 身份证号(主键)private String cardNum;// 对象唯一表示(Object Identified, OID)private String place; //  身份证地址// 身份证与用户,一对一的关系private User user;///把该对象映射到数据库,生成唯一的外键字段public String getCardNum() {    return cardNum;}public void setCardNum(String cardNum) {    this.cardNum = cardNum;}public String getPlace() {    return place;}public void setPlace(String place) {    this.place = place;}public User getUser() {    return user;}public void setUser(User user) {    this.user = user;}

}






    <!--         一对一映射,有外键方(这里不能用one-to-one,只能用many-to-one,这里是特殊的多对一(只是多了唯一约束))        unique="true"   给外键字段添加唯一约束     -->     <many-to-one name="user" unique="true" column="user_id" class="User" cascade="save-update"></many-to-one>                                                                          <!-- 级联保存 --></class>

<class name="User" table="t_user">    <id name="userId">        <generator class="native"></generator>    </id>       <property name="userName" length="20"></property>    <!--         一对一映射: 没有外键的一方     -->     <one-to-one name="idCard" class="IdCard"></one-to-one></class>

**

  • 二、基于主键的约束
    user代码与上面一样,就不写了
    user配置文件也与上面一样,不写了
    两个程序的App测试代码是一样的,统一写在最下面
    **
    package cn.itcast.c_one2one2;

// 身份证
public class IdCard {

private int user_id;     //这里将t_user表的主键作为t_idcard表主键// 身份证号private String cardNum;private String place; //  身份证地址// 身份证与用户,一对一的关系private User user;public int getUser_id() {    return user_id;}public void setUser_id(int userId) {    user_id = userId;}public String getCardNum() {    return cardNum;}public void setCardNum(String cardNum) {    this.cardNum = cardNum;}public String getPlace() {    return place;}public void setPlace(String place) {    this.place = place;}public User getUser() {    return user;}public void setUser(User user) {    this.user = user;}

}

<!-- 基于主键的约束 --><class name="IdCard" table="t_IdCard">    <id name="user_id">        <!--             id 节点指定的是主键映射, 即user_id是本表的主键            主键生成方式: foreign  即把别的表的主键作为当前表的主键;                    property (关键字不能修改)(user)指定引用的对象     对象的全名 cn..User、                再找对象映射 cn.User.hbm.xml、   再找table(id)(即userId)         -->        <generator class="foreign">            <param name="property">user</param> <!-- user -->        </generator>    </id>       <property name="cardNum" length="20"></property>    <property name="place" length="20"></property>    <!--         一对一映射,有外键方        (基于主键的映射)         constrained="true"  指定在主键上添加外键约束     -->    <one-to-one name="user" class="User" constrained="true"  cascade="save-update"></one-to-one>                                       <!-- 给主键(user_id)添加外键约束 --></class>

package cn.itcast.c_one2one;

import org.hibernate.Hibernate;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
import org.junit.Test;

public class App {

private static SessionFactory sf;static {    sf = new Configuration()        .configure()        .addClass(IdCard.class)           .addClass(User.class)   // 测试时候使用        .buildSessionFactory();}@Testpublic void getSave() {    Session session = sf.openSession();    session.beginTransaction();    // 用户    User user = new User();    user.setUserName("Jack");    // 身份证    IdCard idCard = new IdCard();    idCard.setCardNum("441202XXX");    idCard.setPlace("广州XXX");    // 关系    idCard.setUser(user);    // ----保存----    //session.save(user);  ///这里不用这句话的原因是因为:已经在IdCard中设置了级联操作,即在IdCard中已经设置了与User的关系,保存idCard也即保存了user对象    session.save(idCard);       session.getTransaction().commit();    session.close();}

}