Hibernate Mapping OneToOne

时间:2015-08-27 23:20:28

标签: java hibernate spring-data-jpa

我有两个实体,我有一个独特的问题。

实体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.

1 个答案:

答案 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;
  ...
}