首页 > 解决方案 > 如何映射 OneToOne 递归实体?

问题描述

我正在寻找如何在我的 Branch 对象中解决递归和双向单向关系:

@Entity
@Table("BRANCH")
public class Branch {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

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

@OneToOne
@JoinColumn(name = "id")
private Branch parent;

@OneToOne(mappedBy = "parent")
@JoinColumn(name = "parent_id")
private Branch child;

//Getters and Setters
}

它是一种公认​​的模式吗?

标签: javahibernaterecursion

解决方案


带有自引用的双向@OneToOne 映射的正确方法:

@Entity
@Table("BRANCH")
public class Branch {

@OneToOne
@JoinColumn(name = "parent_id")
private Branch parent;

@OneToOne(mappedBy = "parent")
private Branch child;
  • 这是子字段中对象的祖先
  • 这是父字段中对象的后代
  • 层次结构是:父>这个>子

您不需要两个外键,关系拥有方的单个外键就足够了。在 JPA 中,逆 OneToOne 必须使用 mappedBy 属性。

https://en.wikibooks.org/wiki/Java_Persistence/OneToOne#Inverse_Relationships,_Target_Foreign_Keys_and_Mapped_By


推荐阅读