我正在使用Hibernate并为composite keys实现第二种方法,所以我的实体类看起来像这样:
@Entity
public class Metric {
@Id
@Column(nullable = false)
private String generationTime;
@Id
@Column(nullable = false)
private Author publishedBy;
@Id
@Column(nullable = false)
private Parent parent;
// constructor, getters/setters, etc.
}
运行得很好,基于我的SQL客户端,我可以看到该表是使用此SQL(Hibernate的输出)正确生成的:
create table metrics (
generationTimeString varchar(255) not null,
publishedBy_id int8 not null,
parent_id int8 not null,
primary key (publishedBy_id, parentTemplate_id, generationTimeString)
)
但我的问题是,如何在此表中执行搜索?如果我有一个Metric
对象并且我想检查它是否已经存在于表中,我该怎么做?我是否只构建了一个匹配条件与此AND
相结合的查询?
SELECT * FROM metrics
WHERE generationTimeString = 'etc' AND publishedBy = 'author' AND parent = 'parent'
有没有人对Hibernate中的复合键有任何经验?我知道使用the @IdClass
annotation的另一种选择,但这种方式似乎过时了。
答案 0 :(得分:0)
@IdClass
和@EmbeddedId
是有效的替代方案(尽管后者是JPA推荐的)。
关于您的方法,可以在您链接到的文档中看到:
在这种情况下
Customer
是自己的标识符表示,它 必须实施Serializable
。
因此,实体本身(实际上是id属性的组合)是关键。您可以执行以下操作,而不是查询:
Metric metric = new Metric();
metric.setGenerationTime("etc");
metric.setPublishedBy("author");
metric.setParent("parent");
boolean exists = entityManager.find(Metric.class, metric) != null;