使用复合键获取实体

时间:2015-09-28 21:14:38

标签: java hibernate jpa

我正在使用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的另一种选择,但这种方式似乎过时了。

1 个答案:

答案 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;