我对Hibernate和JPA还是陌生的。我有一个Identity类,它与EntityInformation具有一对一的关系,该子类被子类化为PersonalInformation或CompanyInformation。

我正在尝试使用Joined表策略来保持DRY状态,以便数据库中的基本EntityInformation表具有公共字段,而PersonalInformation和CompanyInformation表仅具有特定于类的字段

当我创建带有“公司”类型的身份时,我想为该身份创建一个CompanyInformation。我遇到的问题是,当我创建一个身份时,EntityInformation会保留,而不是Personal / CompanyInformation。

这可能吗?我觉得我缺少了一些东西,或者需要对模型进行不同的建模。任何帮助将不胜感激!



这是我的身份课:

@Entity
@Table(name = "identities")

public class Identity {

  @NotNull
  @Enumerated(EnumType.STRING)
  // type is either Personal or Company
  private IdentityType type;

  @NotNull
  @OneToOne(
    mappedBy = "identity", cascade = CascadeType.ALL, orphanRemoval = true, optional = false)

  private EntityInformation entityInformation;
  ...
}


EntityInformation类:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "entity_informations")

public class EntityInformation {

  @NotNull private Boolean hasTaxPayerId;

  @OneToOne(optional = false)
  @JoinColumn(name = "identity_id", nullable = false)
  private Identity identity;
  ...
}


PersonalInformation类:

public class PersonalInformation extends EntityInformation{

  @NotBlank private String firstName;

  @NotBlank private String lastName;

  private String middleName;
  ...
}


公司信息类别:

public class CompanyInformation extends EntityInformation{

  @NotBlank private String name;
  ...
}

最佳答案

您的身份表有点令人困惑。它与实体具有一一对应关系,并指定实体类型。在设计时,最好对架构进行非规范化并将类型保留在实体中。

优点:更好的性能(而不是额外的联接),清晰度和级联问题的开销更少。

您可以在EntityInformation中添加具有类型的新字段,并在子实体中定义它(如果需要)。

10-08 00:02