4

我有一个 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 中的复合键,因为我知道许多人不鼓励使用它们。

4

1 回答 1

0

您可以使用嵌入式实体,例如包含 id 和 EntityId 的 ObjectPK。而不是使用 @EmbeddedId 从 Object 实体中引用它。

于 2012-12-12T17:53:05.727 回答