(ほとんどの) テーブルが列 TENANT_ID でパーティション分割されている MySQL データベースがあります。各テーブルには、AUTO_INCREMENT を使用する ID フィールドもあるため、すべてのパーティションで一意です。データベースの主キーは、主キーのパーティション列部分を持つという MySQL の要件により、組み合わせ (ID、TENANT_ID) です。
私の Java コードでは、@Id アノテーションを使用して ID 列のみをマップしました。これは主に、Hibernate の複合キーに関する多くの問題を回避するためでした。私が今直面している問題は、Hibernate によって生成されたほとんどの SQL ステートメントが ID 列のみを使用することです。たとえば、Hibernate によって生成された UPDATE ステートメントは次のようになります。
UPDATE object SET value = ? WHERE ID = ?
ただし、このクエリは TENANT_ID の述語を除外するため、パーティショニングを十分に活用できず、ID が見つかるまですべてのパーティションをスキャンする必要があります。生成されたクエリが生成されるようにしたいと思います:
UPDATE object SET value = ? WHERE ID = ? AND TENANT_ID = ?
私の質問は、多くの人が JPA の使用を思いとどまらせていることを知っているので、JPA で複合キーに頼らずにこれを行う簡単な方法があるかどうかです。