使用 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
我正在尝试使用 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