簡體   English   中英

Hibernate-簡單查詢懶惰獲取

[英]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

我的問題是:為什么我的所有播放器都沒有裝滿? 為什么有些人懶惰取來? 我想在不延遲獲取的情況下加載所有播放器,該怎么辦?

謝謝

在XML休眠映射中,您只需編寫: <class name="Player" lazy="false">... ,這將導致急切地獲取播放器對象。

使用注釋您可以使用做同樣的@Proxy(lazy=false)所描述的在這里

您可以在此處找到更多信息

您可以在關聯上使用@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM