2017-03-02 14 views
1

私は、ID(PERSON_ID列)、パーティションキー(TENANT_ID列)、およびAddressEntityのコレクションを持つエンティティPersonEntityを持っています。 AddressEntityには、ID(ADDRESS_ID)、パーティションキー(TENANT_ID)、およびフィールド(VALUE)があります。Hibernateを使用した主キーとパーティションキーによるカスケード削除

これは、それがPersonEntityに見える方法です:私は人を削除するとCascadeType.ALLが、設定されているので

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "person", orphanRemoval = true) 
public Set<AddressEntity> getAddresses() { 
    return addresses; 
} 

、それは同様にアドレスを削除トリガー。その人を削除するには、セッションのdelete(Object)メソッドを使用します。

それはこのようになります削除の結果のSQL:

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

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

が、これはPERSON_IDの両方を使用して、カスケード削除と私は生成され、以下のSQLを取得するようtenant_id実行するための任意のORMの方法はあります

SQLを使用して個々の削除をすべて書き込むことができますが、Hibernateを使用して関連するすべてのテーブルの削除を簡単に処理するのが好きです。

私がこれをやりたい理由は、deleteがaddress_idまたはperson_idを見つけるためにパーティションをループする必要がないことを保証するためです。私がtenant_idにそれを与えたら、すぐに正しいパーティションに行くことができます。

答えて

1

Hibernateでのテーブル分割の使用に関する問題のより一般的な概要については、answerを参照してください。

あなたのユースケースでは、テナントIDも含まれている複合IDを使用することが唯一可能な解決策であるようです。

+0

これは残念ですが、実際には私たちのビジネスワークフローでパーティション間のクエリのユースケースがないので、それほど悪くないと思います。ちょうど余分な仕事を取るだろう - ありがとう。 – AHungerArtist

関連する問題