Hibernate基于主键和外键的单向一对一的关联映射

本文详细介绍了Hibernate中基于外键和主键的一对一关联映射实现方式,并提供了具体的代码示例,帮助读者理解一对一关联关系的配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


表结构
这里写图片描述

基于外键单向一对一的关联映射
其实就是多对一中的一种情况,当unique设置为true时候可以设置一对一的关系,即设置外键值唯一
Person和IdCard类

public class Person {
    private int id;
    private String name;
    private int age;
    private IdCard idCard;
//get…set
}
public class IdCard{
    private int id;
    private String code;
    //get…set
}

IdCard.hbm.xml

<hibernate-mapping package="cn.siggy.pojo">
    <class name="Grade">
        <id name="id">
            <generator class="native"></generator>
        </id>
        <property name="code"/>
    </class>
</hibernate-mapping>

person.hbm.xml(重点来了)

<hibernate-mapping package="cn.siggy.pojo">
<class name="Person">
        <id name="id">
            <generator class="native"></generator>
        </id>
        <property name="name"/>
        <property name="age"/>
        <!-- 当unique设置为true时候可以设置一对一的关系 -->
        <many-to-one name="idCard" class="IdCard" cascade="save-update" column="idCard_Id"  
        foreign-key="fk_idCard" not-null="true"   unique="true">
        </many-to-one>
    </class>
</hibernate-mapping>

测试(session对象的获取封装在HibernateUtil里面)

session = HibernateUtil.getSession();
            tx = session.beginTransaction();
            IdCard id1 = new IdCard();
            id1.setCode("320123231212112");
            IdCard id2 = new IdCard();
            id2.setCode("110231432423432");
            Person person1 = new Person();
            person1.setName("贾宝玉");
            person1.setAge(23);
            person1.setIdCard(id1);
            Person person2 = new Person();
            person2.setName("林黛玉");
            person2.setAge(22);
            person2.setIdCard(id2);
            Person person3 = new Person();
            person3.setName("薛宝钗");
            person3.setAge(21);
            person3.setIdCard(id2);
            session.save(person1);
            session.save(person2);
            //当保存person3出错
            //session.save(person3);
            tx.commit();

基于主键单向一对一的关联映射
其实就是Person的主键生成策略变了。
表结构
这里写图片描述
Person和IdCard类

public class Person {
    private int id;
    private String name;
    private int age;
    private IdCard idCard;
//get…set
}
public class IdCard{
    private int id;
    private String code;
    //get…set
}

IdCard.hbm.xml

<hibernate-mapping package="cn.siggy.pojo">
    <class name="Grade">
        <id name="id">
            <generator class="native"></generator>
        </id>
        <property name="code"/>
    </class>
</hibernate-mapping>

person.hbm.xml (重点来了)

<hibernate-mapping package="cn.siggy.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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值