Spring Boot JPA中Location表继承ProprietiesModel表ID列问题求助
问题分析与实现方案
你当前的代码存在两处核心问题:一是同时在父子类中声明了@Id主键注解,不符合JPA实体继承的规范;二是父类中定义了Location类型的属性会造成循环依赖,无法正常生成表结构。下面提供两种适合新手的落地实现方案:
方案1:单向关联(轻量首选,符合父子表独立存储需求)
取消不必要的类继承,直接通过外键关联两个表,逻辑清晰易理解:
修改后的ProprietiesModel代码
@Entity @Table(name="proprieties") public class ProprietiesModel { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; private String test; // 无特殊双向查询需求可以删掉这里的Location属性,避免循环依赖 public int getId() { return id; } // 补充其余属性的getter、setter方法 }
修改后的Location代码
@Entity @Table(name = "location") public class Location { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; private String street; private int streetNumber; // 关联父表,会自动在location表生成proprieties_id外键字段 @OneToOne @JoinColumn(name = "proprieties_id", referencedColumnName = "id") private ProprietiesModel proprieties; // 封装方法直接获取父表ID public int getProprietiesId() { return proprieties != null ? proprieties.getId() : null; } // 补充其余属性的getter、setter方法 }
后续业务代码中直接调用location实例.getProprietiesId()即可拿到对应父表的ID。
方案2:JPA继承映射(适合需要保留类继承关系的场景)
如果确实需要Location继承ProprietiesModel的属性和方法,可以使用JPA官方的继承策略实现,不需要额外加关联字段:
修改后的ProprietiesModel代码
@Entity @Inheritance(strategy = InheritanceType.JOINED) // 指定父子表独立存储的继承策略 @Table(name="proprieties") public class ProprietiesModel { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; private String test; public int getId() { return id; } // 补充其余属性的getter、setter方法 }
修改后的Location代码
@Entity @Table(name = "location") public class Location extends ProprietiesModel{ // 删掉子类自己定义的id属性,直接继承父类的id private String street; private int streetNumber; // 补充属性的getter、setter方法 }
这个方案下Location实例直接调用从父类继承的getId()方法,拿到的就是proprieties表对应的主键ID。
新手注意事项
- 所有实体类的属性必须补充完整的getter、setter方法,否则JPA无法正常读写数据
- 存储数据时要先保存父表实体,再保存关联的子表实体,避免外键约束报错
内容的提问来源于stack exchange,提问作者Claudiu-Andrei Cojocar
相关产品推荐
相关产品推荐

