我需要帮助来实现特定的休眠继承映射
I need help to implement a specific hibernate Inheritance mapping
我有两个类、parent和child,在child这边我和它自己有关系。该数据库以两个单独的表为模型,parent 和 child 共享相同的“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;
}
Member.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;
}
我将在前端填充这些实体的 object 是:
Member.model
export class Member {
constructor(
public id?: number,
public name?: string,
public memberType?: number,
public idHolder?: any
) {}
}
回答我自己的问题:
正如我所说,我仍在学习 Spring Boot 和 Hibernate,我发现我的问题是典型的循环引用。我打破了我的循环参考设置我的家属(孩子)列表为 write-only,因为我不需要这个 属性 每次都读取。
我也删除了这个多余的 idHolder 属性。
Member.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 管理这个循环引用,这取决于我想处理关系的实体以及我想将它留给另一个的实体。还有其他方法我还需要吸收。
我有两个类、parent和child,在child这边我和它自己有关系。该数据库以两个单独的表为模型,parent 和 child 共享相同的“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; }
Member.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; }
我将在前端填充这些实体的 object 是:
Member.model
export class Member { constructor( public id?: number, public name?: string, public memberType?: number, public idHolder?: any ) {} }
回答我自己的问题:
正如我所说,我仍在学习 Spring Boot 和 Hibernate,我发现我的问题是典型的循环引用。我打破了我的循环参考设置我的家属(孩子)列表为 write-only,因为我不需要这个 属性 每次都读取。
我也删除了这个多余的 idHolder 属性。
Member.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 管理这个循环引用,这取决于我想处理关系的实体以及我想将它留给另一个的实体。还有其他方法我还需要吸收。