2016-09-03 82 views
0

使用Hibernate 5.2和Java 8 我有一個名爲PatientMetaData表,有followng字段(在數據庫表本身,HMO爲整數):休眠:多對一的關係,放入多種關係,只有當

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

健保組織表中包含一個UID和名稱:

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

,並通過在患者表HMO表和HMO的UID相關患者表。

當加載所有患者時,我發現對於每個患者,都會查詢其HMO。
然而,有10K患者和只有7個HMO,因此爲每個患者加載HMO似乎是多餘的。
我有辦法避免所有這些查詢?

一個選項是定義PatientMetadata實體類將hmo作爲一個整數,所以我只會加載患者,然後將所有HMO加載到Java地圖中,最後我會在語法上將HMO從地圖附加到每個病人。

這看起來有點麻煩。
直接用Hibernate有沒有更好的方法?

+0

嘗試'@ManyToOne(fetch = FetchType.LAZY)'。這將僅在使用hmo對象時初始化hmo對象,否則它將爲null –

回答

2

在@ManyToOne上使用懶惰提取時,Hibernate會有一些好奇的行爲,所以這可能不起作用。

我推薦使用@BatchSize(2個可能的位置,在Hmo類或患者關係上)。

根據您檢索患者的方式,您還可以通過JPA標準查詢中的root.fetch()獲取Hmos,以便HMos可以使用左連接加載。

解決方法實際上是一種黑客入侵,應該避免。