我有两个实体,我有一个独特的问题。
实体A可以包含单个实体B. 实体B可以包含单个实体A(但不包含上面的实体)
@Entity
@Table(name = "ENTITYA")
public class EntityA {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long entityAId;
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "entityAId", nullable = true)
private EntityB entityB;
...
}
和
@Entity
@Table(name = "ENTITYB")
public class EntityB {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long entityBId;
private Long officeId;
private Long name;
@OneToOne
private EntityA entityA;
}
我不认为这是双向关系,entityB上的entityA是不同的对象。当我进行搜索并返回EntityA时,我得到一个EntityB,它包含一个具有所有null属性的EntityA。我不知道如何做到这一点的正确映射(甚至看起来似乎是术语)。当试图从搜索中检索实体时,我得到一个StackOverflow。
这是一个可能更有意义的文字说明。患者(EntityA)有一个人(EntityB)负责他们。该人可以包含Patient(EntityA)类型之一。所以A指向B,它引用了另一个A.
答案 0 :(得分:1)
您确定需要两个实体吗?
让我们想象下一个情况:
1)员工只能有一名主管。主管只能负责一名员工。主管是一名员工。
2)主管也受到另一名员工的监督。
这只给我们一个实体和一个自我定位的关系。
@Entity
@Table(name = "EMPLOYEE")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne
@JoinColumn(name = "SUPERVISOR", referencedColumnName = "id")
private Employee supervisor;
@OneToOne(mappedBy="supervisor")
private Employee responsibility;
...
}
另外,我建议你分析一下这些关系是否真的是OneToOne,这在现实世界中是一个罕见的场合。在我的例子中,关系可以很容易地是ManyToOne / OneToMany,员工监督多个其他员工。
@Entity
@Table(name = "EMPLOYEE")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "SUPERVISOR", referencedColumnName = "id")
private Employee supervisor;
@OneToMany(mappedBy="supervisor")
private List<Employee> responsibilities;
...
}