hibernate---->一对一关联映射 (one-to-one)
一对一关联映射 (one-to-one)
两个对象之间是一对一的关系,如Person-IdCard,有两种策略可以实现一对一的关联映射
主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系;数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联
唯一外键关联:外键关联,本来是用于多对一的配置,但是如果加上唯一的限制之后,也可以用来表示一对一关联关系;
一、一对一主键关联映射-单向(Person---->IdCard)
Person类
publicclass Person { private int id; private IdCard idCard; }
映射文件
<hibernate-mapping> <class name="com.wsz.entity.Person" table="t_person"> <id name="id"> <generator class="foreign"> <param name="property">idCard</param> </generator> </id> <property name="name" /> <one-to-one name="idCard" constrained="true"/> </class> </hibernate-mapping>
IdCard类
publicclass IdCard{ private int id; private String idnumber; }
映射文件
<hibernate-mapping> <class name="com.wsz.entity.Id_Card" table="t_idcard"> <id name="id"> <generator class="native" /> </id> <property name="idnumber" /> </class> </hibernate-mapping>
二、一对一主键关联映射-双向(Person<---->IdCard)
Person类
publicclass Person { private int id; private IdCard idCard; }
映射文件
<hibernate-mapping> <class name="com.wsz.entity.Person" table="t_person"> <id name="id"> <generator class="foreign"> <param name="property">idCard</param> </generator> </id> <property name="name" /> <one-to-one name="idCard" constrained="true"/> </class> </hibernate-mapping>
IdCard类
publicclass IdCard{ private int id; private String idnumber; private Person person; }
映射文件
<hibernate-mapping> <class name="com.wsz.entity.Id_Card" table="t_idcard"> <id name="id"> <generator class="native" /> </id> <property name="idnumber" /> <one-to-one name="person"></one-to-one> </class> </hibernate-mapping>
三、一对一唯一外键关联映射-单向(Person---->IdCard)
注意: 一对一唯一外键关联映射 是 多对一关联映射的特例
可以采用<many-to-one>标签,指定多的一端的unique=true,这样就限制了多的一端的多重性为一
person.hbm.xml
<class name="com.bjsxt.hibernate.Person" table="t_person"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <!--数据库中person中会有一个idCard字段作为外键 参照 IdCard的主键--> <many-to-one name="idCard" unique="true"/> </class>
IdCard.hbm.xml
<hibernate-mapping> <class name="com.bjsxt.hibernate.IdCard" table="t_idcard"> <id name="id"> <generator class="native"/> </id> <property name="cardNo"/> </class> </hibernate-mapping>
四、一对一唯一外键关联映射--双向关联 (Person<---->IdCard)
一对一唯一外键关联双向,需要在另一端(idcard),添加<one-to-one>标签,指示hibernate如何加载其关联对象,
默认根据idcard主键 --> person主键加载person,外键关联映射中,因为两个实体采用的是person的外键维护的关系,所以不能根据person主键加载person,而要根据idcard主键 --> person的外键加载person,所以采用如下映射方式: <one-to-one name="person" property-ref="idCard"/>
Person.hbm.xml
<hibernate-mapping> <class name="com.bjsxt.hibernate.Person" table="t_person"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <many-to-one name="idCard" unique="true"/> </class> </hibernate-mapping>
IdCard.hbm.xml
<class name="com.bjsxt.hibernate.IdCard" table="t_idcard"> <id name="id"> <generator class="native"/> </id> <property name="cardNo"/> <!--one-to-one不会在数据库中加外键字段,只是告诉hibernate如何去加载关联对象 property-ref="idCard"表示不是根据person主键加载,而是根据person的idCard字段加载 --> <one-to-one name="person" property-ref="idCard"/> </class>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律