Hibernate一对一映射主键外键关联及对应XML配置实现方法
Hibernate 一对一外键关联配置方案
现有配置的核心问题
你当前使用的表结构属于外键关联式一对一:Address有独立主键aid,通过eid字段作为外键关联Employee的主键Eid,但你写的配置是主键共享式一对一的逻辑,和表结构完全不匹配,具体问题如下:
- Address的主键配置错误:表中Address的主键是aid,你错误将eid配置成了Address的主键
<one-to-one>标签本身不支持column属性,你在Address的关联配置中加column属于无效配置- Employee的属性配置和表字段不匹配:表中Employee的薪资字段是esal,你配置了不存在的designation字段
主键与外键管理逻辑
这种独立主键+外键关联的一对一,核心管理规则:
- Employee为关系主端,Address为关系从端,外键eid存放在Address表中
- Address表的eid字段需要添加唯一约束,保证每个Eid只出现一次,实现一对一的语义
- 保存时先存Employee,再存Address,自动将Employee的主键赋值给Address的eid外键字段
正确XML映射配置
Employee映射文件
<class name="Employee" table="employee" schema="system"> <!-- 主键对应表中Eid字段 --> <id name="id" column="Eid"> <generator class="increment"></generator> </id> <property name="name" column="ename" /> <!-- 对应表中esal字段,实体类中对应salary属性,可根据你自己的实体类属性名调整 --> <property name="salary" column="esal" /> <!-- 一对一关联Address,property-ref指定Address类中关联Employee的属性名emp --> <one-to-one name="address" class="Address" cascade="all" property-ref="emp"/> </class>
Address映射文件
<class name="Address" table="address" schema="system"> <!-- 主键对应表中aid独立主键,如果你实际表名是address_details,修改table属性值即可 --> <id name="aid" column="aid"> <generator class="increment"/> </id> <property name="addressLine1" column="addressLine1"/> <property name="city" column="city"/> <property name="state" column="state"/> <!-- 用many-to-one+unique=true实现外键关联的一对一,外键字段为eid --> <many-to-one name="emp" class="Employee" column="eid" unique="true" not-null="true"/> </class>
实体类对应要求
- Employee类中需要添加
Address address属性,以及对应的get、set方法 - Address类中需要添加
Employee emp、Integer aid、String addressLine1等和表字段对应的属性,以及对应的get、set方法
内容的提问来源于stack exchange,提问作者Beginner
相关产品推荐
相关产品推荐

