假设我有以下域模型:
users
----
id (PK)
partitionkey (PK)
在上表中,分区键主要用于分区。 (MySQL要求partitionkey成为主键的一部分)。如果我们假设记录只能由id字段唯一标识,那么在映射中跳过partitionkey是否有任何危害。例如,下面的映射是否有效:
@Entity
@Table(name = "users")
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="id")
public Long id;
@Column(name="partitionkey")
private Long partitionKey;
}
答案 0 :(得分:0)
尝试使用PK字段定义单独的@Embeddable
对象,并在@EmbeddedId
类中将其用作@Entity
,如下所示:
@Embeddable
public class MyCompositePK {
@Column(name="id")
private Long id;
@Column(name="partitionkey")
private Long partitionKey;
}
@Entity
@Table(name = "users")
public class User implements Serializable {
@EmbeddedId
private MyCompositePK id;
...
}
答案 1 :(得分:0)
是的,它有效。 JPA提供程序不知道实体映射到的表中存在任何约束或其他功能。
然而,这是一个好方法,特别是因为我们在这里谈论分区?请记住,实体通过ID关联。因此,对于与User
关联的每个实体,JPA提供程序将仅按id列搜索关联的User
实例,因此分区列将不会包含在查询中。这可能是也可能不是问题。有关详细信息,请参阅this answer。
替代方案可能是在Hibernate中使用提供程序特定的扩展,例如@JoinFormula
,但它们可能不容易正确。
我想说使用复合ID是最直接的解决方案。