繁体   English   中英

休眠一对一映射

[英]Hibernate Mapping OneToOne

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

实体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,其中包含具有所有空属性的EntityA。 我不知道如何执行此操作的正确映射(甚至是术语)。 当尝试从搜索中检索实体时,出现StackOverflow。

这是可能更有意义的文字描述。 患者(实体A)有一个负责他们的人(实体B)。 该人员可以包含患者(EntityA)类型之一。 因此,A指向B,后者引用了另一个A。

您确定需要两个实体吗?

让我们想象下一种情况:

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

我也建议您分析一下这些关系是否确实是“一对一”,这在现实世界中很少见。 在我的示例中,这种关系很容易是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;
  ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM