首页 > 解决方案 > 在 Hibernate JPA 中使用不同的父类映射“Has-A”关系

问题描述

@Entity
@Table(name = "OptionalCommonData")
public class OptionalCommonData {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)        
    private Long id;

    private String commonPropertyA;
    private String commonPropertyB;
    private String commonPropertyC;
    private String commonPropertyD;

}

我有一个像上面这样的实体。许多其他实体类将这个可选的公共数据作为has-a关系提供给它。我应该如何实现这一点,以便可以重用 OptionalCommonData 类和表?

如果它没有被重新使用,我只需将其添加到父类中:

@OneToOne(mappedBy = "parentObject", optional = true)
private OptionalCommonData optionalCommonData;

然后将其添加到 OptionalCommonData:

@OneToOne
@PrimaryKeyJoinColumn(name = "parent_id")
ParentClass parentObject;

标签: javahibernatejpa

解决方案


如果要在hibernate中实现继承,它提供了四种主要的解决方案:

  • 使用@MappedSuperclass注释。
  • 使用@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
  • 使用@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
  • 使用@Inheritance(strategy = InheritanceType.JOINED)

您可以通过 JPA 中的示例和操作手册中的休眠来了解所有这些选项、优缺点:https ://livebook.manning.com/book/java-persistence-with-hibernate-second-edition/chapter-6/ 1 .

简要地:

  • 当您的父类不是实体(因此它不会映射到数据库表中)并且您不需要多态查询(例如 SELECT ocd FROM OptionalCommonData ocd)时,可以使用 @MappedSuperclass 注解。
  • 当您想通过非规范化实现高性能时,使用策略 SINGLE_TABLE。
  • 策略 TABLE_PER_CLASS 与 @MappedSuperclass 类似,但多态查询是使用 UNION 命令执行的。
  • 而在JOINED策略中,子表不从父类继承数据,因为它们使用外键,当需要多态查询时可以使用该策略。

在您的情况下,最好使用 @Inheritance 注释。


推荐阅读