我正在嘗試優化一些報告,并試圖消除加載一些昂貴的相關記錄的需要(多個級聯加載,每條記錄約 500 多條)。
我的物體是這樣的:
@Entity
@Table(name="foo")
public class Foo
{
@Id
@Type(type = "pg-uuid")
private UUID id;
...
public UUID getId(){
return id;
}
和:
@Entity
@Table(name="bar")
public class Bar
{
@Id
@Type(type = "pg-uuid")
private UUID id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="FOO_ID")
private Foo foo;
...
public UUID getFooId(){
return foo.getId();
}
我的問題是,當我進行此呼叫時:return foo.getId();hibernate 會去實體化 Foo 物體,并加載所有相關記錄,即使我只想要/需要 id,它是我的 Bar 表中的外鍵。
有沒有辦法在不加載 Foo 記錄的情況下從 Bar 獲取 Foo.Id ?提前致謝。
uj5u.com熱心網友回復:
Hibernate 認為這getFooId()是一種可以潛在地使用Bar. Hibernate 無法檢查該方法究竟使用了哪些欄位,因此它會加載所有惰性關聯以防萬一。
您可以使用@Transient來避免這種情況
@Transient
public UUID getFooId(){
return foo.getId();
}
uj5u.com熱心網友回復:
嘗試將 FOO_ID 列映射為基本映射,而不是現有的 Foo 參考映射:
@Entity
@Table(name="bar")
public class Bar
{
@Id
@Type(type = "pg-uuid")
private UUID id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="FOO_ID")
private Foo foo;
@Column(name="FOO_ID", insertable=false, updatable=false)
private UUID fooId;
...
public UUID getFooId(){
return fooId;
}
然后,您可以決定在查詢中使用 fooId 以避免連接。因為它是只讀的,所以 FK 值仍然是從 foo 參考中設定的——如果你設定的是參考而不是 fooId UUID,快取可能會出現一些問題;您可以自己設定,也可以強制重繪 讓 JPA 為您完成。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/461309.html
