Hibernate/JPA一对一映射中Address表数据未插入的原因排查
一对一关联中Address未插入数据库的原因分析
- 双向关联未完整建立
你把关联维护权交给了Info和Address(通过Employee的mappedBy),这意味着只有维护端(Info、Address)持有外键,必须在维护端设置对Employee的引用。如果测试代码里只在Employee里关联了Address,却没给Address设置对应的Employee对象,Hibernate会认为Address不属于当前关联图的一部分,级联保存不会触发。
比如错误操作:
// 只设置了Employee到Address的单向关联 emp.setAddress(addr); // 没设置addr.setEmployee(emp);
级联触发的前提是关联被Hibernate识别
CascadeType.ALL的作用是,当对Employee执行保存时,级联处理它已建立有效双向关联的实体。单向的关联不会被Hibernate纳入级联范围,因为维护端(Address)没有反向指向Employee,Hibernate无法确认这是需要持久化的关联对象。Address的映射可能存在疏漏
检查Address实体的@OneToOne注解是否正确配置了外键。比如是否添加了@JoinColumn指定外键列,如果没有正确定义外键字段,即使设置了双向关联,Hibernate也无法生成插入Address的SQL语句。
正确的Address映射示例:
@Entity public class Address { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; // 配置外键,指定关联到Employee的字段 @OneToOne @JoinColumn(name = "employee_id") private Employee employee; // getter、setter方法 }
解决办法就是补全双向关联:
Employee emp = new Employee(); Info info = new Info(); Address addr = new Address(); // 同时设置双向关联 emp.setInfo(info); info.setEmployee(emp); emp.setAddress(addr); addr.setEmployee(emp); session.save(emp);
内容的提问来源于stack exchange,提问作者Juber Ahemad
相关产品推荐
相关产品推荐

