我需要帮助来实现特定的休眠继承映射

Posted

技术标签:

【中文标题】我需要帮助来实现特定的休眠继承映射【英文标题】:I need help to implement a specific hibernate Inheritance mapping 【发布时间】:2021-11-05 19:13:31 【问题描述】:

我有两个类,父类和子类,在子类中我与自身有关系。数据库以两个单独的表为模型,父子表共享相同的“id”,列“holder”作为其自身的外键。我写了以下代码。我正在学习,很快就会陷入这个复杂的继承和相互关系示例,我想知道我是否正确使用了这些符号。

Person.class

@Entity
@Getter @Setter @NoArgsConstructor
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "person")
public class Person 

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "id")
  private Integer id;

  @NotNull
  @Column(name = "name")
  private String name;

成员.class

@Entity
@Getter @Setter @NoArgsConstructor
@Table(name = "member")
public class Member extends Person 

    @NotNull
    @Column(name = "member_type")
    private Integer memberType;

    @Column(name = "id_holder")
    private Integer idHolder;

    @ManyToOne(targetEntity = Member.class)
    @JoinColumn(name = "id_holder", referencedColumnName = "id", insertable = false, updatable = false)
    private Member holder;

    @OneToMany(mappedBy = "holder", cascade = CascadeType.ALL)
    private List<Member> dependents;

我将在前端填充这些实体的对象是:

会员模型

export class Member 
    constructor(
        public id?: number,
        public name?: string,
        public memberType?: number,
        public idHolder?: any
    ) 

【问题讨论】:

【参考方案1】:

回答我自己的问题:

正如我所说,我还在学习 Spring Boot 和 Hibernate,我发现我的问题是一个经典的循环引用。我打破了循环引用,将我的依赖项(子项)列表设置为只写,因为我不需要每次都读取此属性。

我还删除了这个 idHolder 冗余属性。

成员.class

@Entity
@Getter @Setter @NoArgsConstructor
@Table(name = "member")
public class Member extends Person 

    @NotNull
    @Column(name = "member_type")
    private Integer memberType;

    @ManyToOne
    @JoinColumn(name = "id_holder", referencedColumnName = "id")
    private Member holder;

    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    @OneToMany(mappedBy = "holder")
    private List<Member> dependents;

现在我知道我也可以使用 JsonManagedReference/JsonBackReference 来管理这个循环引用,这取决于我想要处理关系的实体以及我想将它留给另一个实体。以及我仍然需要同化的其他方式。

【讨论】:

以上是关于我需要帮助来实现特定的休眠继承映射的主要内容,如果未能解决你的问题,请参考以下文章

将对象保存到数据库时使用休眠

具有继承映射的多对一自引用

Hibernate中的继承映射

使用单表的休眠继承

Hibernate继承映射(@Inheritance)

一口一口吃掉Hibernate——继承映射