使用 Hibernate 按主键和分区键级联删除
Cascade deletes by primary key and partition key using Hibernate
我有一个实体 PersonEntity,它有一个 ID(PERSON_ID 列)、一个分区键(TENANT_ID 列)和一个 AddressEntity 集合。 AddressEntity 有一个 ID (ADDRESS_ID)、一个分区键 (TENANT_ID) 和一个字段 (VALUE)。
这是它在 PersonEntity 中的样子:
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "person", orphanRemoval = true)
public Set<AddressEntity> getAddresses() {
return addresses;
}
由于设置了CascadeType.ALL,当我删除一个人时,它也会触发地址的删除。我用Session的delete(Object)
方法删除人
该删除的结果 SQL 如下所示:
delete from address where address_id=?
delete from person where person_id=?
是否有任何 ORM 方法可以同时使用 person_id 和 tenant_id 执行此级联删除,以便生成以下 SQL:
delete from address where address_id=? and tenant_id=?
delete from person where person_id=? and tenant_id=?
我知道我可以使用 SQL 简单地编写所有单独的删除,但我喜欢使用 Hibernate 来处理所有关联的 table 删除的简单性。
我这样做的原因是为了确保删除不必遍历分区来查找 address_id 或 person_id。如果我给它 tenant_id,它就能立即转到正确的分区。
查看此 以更全面地了解在 Hibernate 中使用 table 分区的困难。
对于您的用例,使用其中还包含租户 ID 的复合 ID 似乎是唯一可能的解决方案。
我有一个实体 PersonEntity,它有一个 ID(PERSON_ID 列)、一个分区键(TENANT_ID 列)和一个 AddressEntity 集合。 AddressEntity 有一个 ID (ADDRESS_ID)、一个分区键 (TENANT_ID) 和一个字段 (VALUE)。
这是它在 PersonEntity 中的样子:
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "person", orphanRemoval = true)
public Set<AddressEntity> getAddresses() {
return addresses;
}
由于设置了CascadeType.ALL,当我删除一个人时,它也会触发地址的删除。我用Session的delete(Object)
方法删除人
该删除的结果 SQL 如下所示:
delete from address where address_id=?
delete from person where person_id=?
是否有任何 ORM 方法可以同时使用 person_id 和 tenant_id 执行此级联删除,以便生成以下 SQL:
delete from address where address_id=? and tenant_id=?
delete from person where person_id=? and tenant_id=?
我知道我可以使用 SQL 简单地编写所有单独的删除,但我喜欢使用 Hibernate 来处理所有关联的 table 删除的简单性。
我这样做的原因是为了确保删除不必遍历分区来查找 address_id 或 person_id。如果我给它 tenant_id,它就能立即转到正确的分区。
查看此
对于您的用例,使用其中还包含租户 ID 的复合 ID 似乎是唯一可能的解决方案。