使用Hibernate

时间:2017-03-02 20:16:47

标签: java sql hibernate orm database-partitioning

我有一个实体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和ten​​ant_id执行此级联删除,以便生成以下SQL:

delete from address where address_id=? and tenant_id=?
delete from person where person_id=? and tenant_id=?

我知道我可以简单地使用SQL编写所有单独的删除,但我喜欢使用Hibernate来处理所有相关表删除的简单性。

我想这样做的原因是为了确保删除不必遍历分区以找到address_id或person_id。如果我给它tenant_id,它将能够立即转到正确的分区。

1 个答案:

答案 0 :(得分:1)

请查看此answer,以获得有关在Hibernate中使用表分区的困难的更一般概述。

对于您的用例,使用其中还包含租户ID的复合ID似乎是唯一可行的解​​决方案。