Hibernate一对一关联插入数据异常问题求助:emps表新增冗余列且emps_sal无数据插入
解决JPA一对一关联插入异常的问题
我来帮你排查下这个插入异常的问题,你遇到的情况完全是因为一对一关联的映射配置出了几个关键错误,咱们一步步来修正:
问题根源分析
你的实体类配置有两个核心问题:
- 错误使用
@PrimaryKeyJoinColumn:这个注解是用于共享主键的一对一关系(即两张表用同一个主键值),但你的emps_sal表有独立的自增主键emps_sal_id,属于普通外键关联的一对一场景,不该用这个注解。 - 冗余的
ids字段:你在Emps_sal里手动定义了int ids字段,这会和JPA通过关联属性维护的外键列冲突,而且完全没必要——JPA会自动管理外键列的值。 - 映射关系的维护方配置混乱,导致JPA没有正确同步
emps_sal的数据,反而在emps表生成了多余的esal_emps_sal_id列。
修正后的实体类代码
1. Emps实体(关系被维护方)
@Entity public class Emps { @Id @Column(name="id") int id; String name; // mappedBy指定当前是被维护方,关系由Emps_sal的e属性维护 // 添加CascadeType.ALL,实现通过Emps级联操作Emps_sal @OneToOne(mappedBy = "e", cascade = CascadeType.ALL) Emps_sal esal; // 必须添加getter/setter方法,JPA依赖这些访问属性 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Emps_sal getEsal() { return esal; } public void setEsal(Emps_sal esal) { this.esal = esal; } }
2. Emps_sal实体(关系维护方)
@Entity public class Emps_sal { @Id @GeneratedValue(strategy=GenerationType.AUTO) int emps_sal_id; int salary; // 用@JoinColumn指定外键列名是ids,关联到Emps的id主键 @OneToOne @JoinColumn(name = "ids", referencedColumnName = "id") Emps e; // 必须添加getter/setter方法 public int getEmps_sal_id() { return emps_sal_id; } public void setEmps_sal_id(int emps_sal_id) { this.emps_sal_id = emps_sal_id; } public int getSalary() { return salary; } public void setSalary(int salary) { this.salary = salary; } public Emps getE() { return e; } public void setE(Emps e) { this.e = e; } }
正确的插入代码
Emps e = new Emps(); e.setId(100); e.setName("Johnson"); Emps_sal es = new Emps_sal(); es.setSalary(5000); es.setE(e); // 维护方设置关联关系 e.setEsal(es); // 双向关联保持一致,避免数据不一致 // 因为配置了级联,只需要保存Emps即可同步插入Emps_sal entityManager.persist(e);
修正后的效果
emps表只会保留你定义的id和name列,不会再生成多余的esal_emps_sal_idemps_sal表会正确插入类似(7, 100, 5000)的记录,其中7是自增的emps_sal_id,100是关联的emps主键
内容的提问来源于stack exchange,提问作者David Johnson
相关产品推荐
相关产品推荐

