JPA JOINED继承类型下父实体OneToMany关联持久化异常求助
问题原因分析与修复方案
1. 子类Employee主键定义违反JOINED继承规则
在InheritanceType.JOINED继承策略下,父类的主键会自动作为子类表的外键,子类不能额外定义@Id注解。你在Employee中添加的@Id private String name会破坏JPA的继承主键映射逻辑,导致父类ID无法正确传递,进而影响关联实体的外键赋值。
修正后的Employee实体:
@Entity @Table(name="EMPLOYEE") public class Employee extends Person{ // 移除子类的@Id注解,继承父类的Long id作为主键 @Column(name="NAME") private String name; }
2. 双向关联维护端未设置关联关系
@OneToMany(mappedBy="person")指定了Address是关联的维护端,JPA仅会根据维护端(Address)的person字段维护外键。你只给Employee设置了addresses集合,但未给每个Address对象绑定对应的Employee,导致Address的parent_id字段为null,触发数据库非空约束错误。
修正后的保存代码:
// 给每个Address绑定关联的Employee List<Address> addressList = new ArrayList<>(); Address addr = new Address(); addr.setAddress("XX街道XX号"); addr.setPerson(employee); // 关键:设置维护端的关联关系 addressList.add(addr); Employee employee = Employee.builder() .name("john doe") .personId("abc123") .addresses(addressList) .build(); employeeRepository.save(employee);
3. Address实体的注解与拼写错误
存在多处拼写和注解格式错误,直接影响JPA的映射逻辑:
- 类名拼写:
Adress→Address - 字段名拼写:
adress→address - 注解大小写:
@ManytoOne→@ManyToOne,@joinColumn→@JoinColumn - 引号配对:
@Column(name='DB_ID)改为@Column(name="DB_ID")
修正后的Address实体:
@Entity @Table(name="ADDRESS") public class Address{ @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="DB_ID") private Long id; @Column(name="ADDRESS") private String address; @ManyToOne @JoinColumn(name="parent_id", referenceColumnName="PERSON_ID") private Person person; // getter、setter省略 }
4. 其他细节错误
- EmployeeRepository泛型拼写错误:
Emploee→Employee,修正后:
public interface EmployeeRepository extends JpaRepository<Employee, Long>{}
- 父类Person代码错误:
Public改为public,移除@OneToMany注解后的多余大括号,修正后片段:
@Entity @Inheritance(strategy=InheritanceType.JOINED) @Table(name="PERSON") public class Person{ @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="DB_ID") private Long id; @Column(name="PERSON_ID") private String personId; @OneToMany(mappedBy="person", cascade={CascadeType.PERSIST,CascadeType.MERGE}) private List<Address> addresses; // getter、setter省略 }
内容的提问来源于stack exchange,提问作者aryaD
相关产品推荐
相关产品推荐

