@OneToOne 关系与附加约束

@OneToOne relationship with additional constraint

假设,我们有两个实体,第一个:

@Entity
@Table(name = "entitya")
public class EntityA {

  @Id
  @Column(name = "id")
  private Long id;

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

  @OneToMany(mappedBy = "parent", fetch = FetchType.LAZY)
  private Set<EntityB> childEntities;

}

第二个:

@Entity
@Table(name = "entityb")
public class EntityB {

  @Id
  @Column(name = "id")
  private Long id;

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

  @Column(name = "master")
  private Boolean master;

  @ManyToOne
  @JoinColumn(name = "parent")
  private EntityA parent;

}

到目前为止,还不错。然而,底层数据库表和约束强制要求对于任何 entityA 只能有一个 EntityB 布尔字段 master 设置为 true。我可以通过向 entityA 添加以下方法来提取它:

public entityB getMasterChild() {

  for(entityB ent : childEntities) {
    if(ent.isMaster()) {
      return ent;
    }
  }

}

问题是,我可以在 EntityA 中创建可以表达该规则的 @OneToOne 关系,以便 entityA 可以有额外的 masterChild 类型 entityB 成员吗?

如果我对你的理解是正确的,你想 create/define 两个实体之间的关系基于某个实体的 属性 的值。想法是实体之间的关系是根据实体计数(有多少实体可以拥有另一个实体)定义的,而不是根据某个实体的 属性 值定义的。

不过
如果您真的想为 masterChild 使用 @OneToOne 映射,我建议为它创建一个单独的 table/entity。完成后,您可以将这个新的 MasterChild 实体包含到 EntityA 中并用 @OneToOne.

对其进行注释

这是新的 MasterChild 实体

@Entity
public class MasterChild extends EntityB{

  @Id
  @Column(name = "id")
  private Long id;    
}

请注意,我已将 'master' 从 EntityB 中删除,因为不再需要它

@Entity
@Table(name = "entityb")
public class EntityB {

  @Id
  @Column(name = "id")
  private Long id;

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

  @ManyToOne
  @JoinColumn(name = "parent")
  private EntityA parent;

}

这里修改了EntityA

@Entity
@Table(name = "entitya")
public class EntityA {

  @Id
  @Column(name = "id")
  private Long id;

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

  @OneToOne
  private MasterChild master;

  @OneToMany(mappedBy = "parent", fetch = FetchType.LAZY)
  private Set<EntityB> childEntities;

}