[英]Hibernate - simple query lazy fetching
我正在將Play框架與Hibernate和JPA一起使用。
我有一個簡單的實體:
@Entity
public class Player extends Model {
@Required
public Long gold;
}
我想檢索所有玩家,所以這是我使用Hibernate執行的查詢:
select p from Player p
結果已經存儲在一個列表中: List<Player>
,當我想調試一下列表中的內容時,我可以看到104個播放器,但是列表中只有5個第一播放器被真正加載。 其他玩家則懶惰地獲取:類名類似於Player_$$_javassist_22
。
我的問題是:為什么我的所有播放器都沒有裝滿? 為什么有些人懶惰取來? 我想在不延遲獲取的情況下加載所有播放器,該怎么辦?
謝謝
您可以在關聯上使用@ManyToOne(fetch = FetchType.EAGER)
以禁用延遲加載。
首先讓我們了解'javax.persistence.FetchType'
的概念,假設您有兩個實體,例如“ Player”和“ Team” ,它們之間具有@oneToMany
關系
@Entity
@Table(name = "player")
public class Player extends Model {
public Long gold;
String name;
}
和
@Entity
@Table(name = "team")
public class Team {
@Column (name = "name")
public String name;
@OneToMany(fetch = FetchType.LAZY,mappedBy="players")
public List<Player> players;
}
現在,當您從數據庫加載團隊時 ,JPA會為您加載其名稱字段。 但是,玩家有兩個選擇:將其與其余字段一起加載(即FetchType.EAGER
[ FetchType.EAGER
]),或在調用Teams getPlayers()時按需加載(即lazily [ FetchType.LAZY
])。 ) 方法。
當一個團隊有很多球員時,在不需要所有球員時,將所有球員都裝載進去效率不高。 因此,在這種情況下,您可以聲明希望在實際需要播放器時加載它們。 這稱為延遲加載。
因此由您決定哪種FetchType
適合您的問題。 如果您真的想在加載團隊時加載所有玩家,請使用FetchType.EAGER
。
希望這能解決您的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.