使用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?
答案 0 :(得分:2)
在@ManyToOne上使用延迟提取时,Hibernate会产生奇怪的行为,所以这可能不起作用。
我建议使用@BatchSize(2个可能的位置,Hmo类或患者的关系)。
根据您检索患者的方式,您还可以在JPA标准查询中通过root.fetch()获取Hmos,以便HMos加载左连接。
解决方法实际上是一个黑客,应该避免。