Hibernate:ManyToOne关系,加载许多关系只有一次

时间:2016-09-03 08:15:31

标签: java hibernate

使用Hibernate 5.2和Java 8 我有一个名为PatientMetaData的表,其中包含以下字段(在DB表本身中,hmo是一个整数):

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int uid;
private String name;
@ManyToOne
@JoinColumn(name="hmo")
private Hmo hmo;

Hmo表包含一个uid和一个名称:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int uid;
private String name;

并通过hmo表中的uid和患者表中的hmo与患者表相关。

当加载所有患者时,我看到每个患者都有对其HMO的查询 然而,有10K名患者和仅7名HMO,因此为每位患者加载HMO似乎是多余的 我有办法避免所有这些疑问吗?

一个选项是定义PatientMetadata实体类以将hmo作为整数,因此我只加载患者,然后将所有HMO加载到Java映射中,最后我将语法上附加一个HMO每个病人的地图。

这看起来有点麻烦 有没有更好的方法直接使用Hibernate?

1 个答案:

答案 0 :(得分:2)

在@ManyToOne上使用延迟提取时,Hibernate会产生奇怪的行为,所以这可能不起作用。

我建议使用@BatchSize(2个可能的位置,Hmo类或患者的关系)。

根据您检索患者的方式,您还可以在JPA标准查询中通过root.fetch()获取Hmos,以便HMos加载左连接。

解决方法实际上是一个黑客,应该避免。