使用 InheritanceType.JOINED 和每个 table 中的 `tenant_id` 列实现分层数据库 table

Implementing hierarchical DB tables with InheritanceType.JOINED and a `tenant_id` column in every table

我正在尝试使用 InheritanceType.JOINED 方法在分层数据库 table 中存储数据来实现分层结构。需要注意的是,在我们的多租户解决方案中,需要在每个 table 上出现 tenant_id(出于安全和合法出口原因),即使在某些情况下这是多余的。此要求已修复。

问题是在插入数据时,Hibernate 生成的查询没有填写父子table 上的tenant_id,导致约束错误。

DB 中的 table 如下所示:

抽象车辆实体的代码:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
abstract class Vehicle(
    var tenantId: Int,
    var title: String
)

汽车实体:

@Entity
class Car(
    override var tenantId: Int,
    override var title: String,
) : Vehicle(tenantId, title) {

    var numberOfDoors: Int
}

位面实体:

@Entity
class Plane(
    override var tenantId: Int,
    override var title: String,
) : Vehicle(tenantId, title) {

    var numberOfPropellers: Int
}

当在数据库中插入新的 Car 时,Hibernate 生成 2 个查询,其中 tenant_id 仅添加到抽象 Vehicle table:

insert into vehicle (tenant_id, title) values (?, ?)

insert into car (id, number_of_doors) values (?, ?)

有没有办法指示 Hibernate 在两个 table 上填写列?

我发现的一个技巧是在 class 上实现“第二个”tenantId 变量并明确指定一个列,例如:

@Column(name = "tenant_id")
private val _tenantId: Int = tenantId

但它不是很干净,更简洁的解决方案会更好。

特别是在 tenant_id 列是数据库设置的情况下,在 tenant_id 数据库列上定义计算的默认值也可以作为一种解决方法:

current_setting('app.current_tenant', true)::INT