【发布时间】:2012-10-29 09:32:55
【问题描述】:
我有一个 MySQL 数据库,其中(大多数)表在 TENANT_ID 列上进行分区。每个表还有一个使用 AUTO_INCREMENT 的 ID 字段,因此在所有分区中都是唯一的。数据库主键是一个组合(ID,TENANT_ID),因为 MySQL 要求分区列是主键的一部分。
在我的 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 中使用复合键,因为我知道很多人不鼓励使用它们。
【问题讨论】:
-
你真的需要这两列(
TENANT_ID和ID)吗?难道你不能完全删除ID列,并将TENANT_ID定义为主键吗? -
选项2:用
ID而不是TENANT_ID分区呢?
标签: mysql hibernate jpa partitioning