返回

Hibernate 中的单表继承:实现父类-子类关系

java

单表继承:使用 Hibernate 实现

在对象-关系映射 (ORM) 中,单表继承是一种将父类和子类的数据存储在同一个数据库表中的技术。在 Hibernate 中,可以使用 @Inheritance(strategy = InheritanceType.SINGLE_TABLE) 注释实现单表继承。

复合主键和判别器列

使用单表继承时,父类和子类共享同一主键列。可以通过 @IdClass 注释定义复合主键。判别器列用于区分表中不同类型的实体,可以使用 @DiscriminatorColumn 注释定义。

解决重复列问题

如果判别器列也是主键列的一部分,则可能会出现重复列问题。为了解决这个问题,可以将判别器列标记为在插入和更新时不可用,从而确保它不会被指定为 null

无需指定类型

在子类中,可以省略 type 字段。Hibernate 将自动从判别器列中推断 type 值。

使用示例

以下代码示例演示了如何使用单表继承实现父类-子类关系:

@Entity
@Table(schema = "timesheetdb", name = "project_property")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type")
public abstract class ProjectPropertyAbstract {

    @Id
    private Integer projectId;

    @Id
    private String type;
}

@Entity
@DiscriminatorValue("WAGE_FUND")
public class ProjectWageFundProperty extends ProjectPropertyAbstract {

    private Boolean isEnabled;
    private Integer percentProfit;
}

@Entity
@DiscriminatorValue("CROSS_STAFFING")
public class ProjectCrossStaffingProperty extends ProjectPropertyAbstract {

    private Boolean isEnabled;
}

常见问题解答

  • 什么是单表继承?
    它是一种将父类和子类的数据存储在同一个数据库表中的 ORM 技术。

  • 如何实现单表继承?
    可以使用 Hibernate 的 @Inheritance(strategy = InheritanceType.SINGLE_TABLE) 注释。

  • 为什么需要使用复合主键?
    因为父类和子类共享同一主键列。

  • 判别器列是什么?
    它用于区分表中不同类型的实体。

  • 如何解决重复列问题?
    将判别器列标记为在插入和更新时不可用。

结论

单表继承在某些情况下是一个有用的 ORM 技术,例如,当所有子类具有相似的属性时。通过仔细规划和实现,可以避免重复列问题,并为父类和子类存储数据提供一个高效的解决方案。