java - 在 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;
解决方案
如果要在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 注释。
推荐阅读
- sql - Oracle SQL 在两个子查询上左外连接
- java - 如何找到正在使用相机的应用程序?
- python - Python to file - 使用 2D 数组存储字符串的最佳方式
- php - php regex - 在字符串中查找字符串
- jenkins - 如何标记工件构建官方以用于部署?
- hyper-v - Add-NetNatStaticMapping 不适用于 Hyper-V Windows 8 VM
- file - 在 Fortran 中,如何通过从下到上的行块从一个文件向后写入另一个文件
- amazon-web-services - GetTraceSummaries 响应不包括“ServiceIds”
- sql - Django ORM 查询从多个表中获取数据
- r - 根据用户输入更新数据框中的日期