簡體   English   中英

Hibernate逐一加載不需要的實體,並將其標記為惰性提取類型

[英]Hibernate loading one by one not needed entities marked as lazy fetch type

通過休眠使用postgresql數據庫。 我有一個實體(表)TeamInfo(bb_team_info),並嘗試執行以下代碼:

strQuery.append("SELECT * from bb_team_info WHERE id in (SELECT bb_team_info_id FROM bb_team_league_info tl WHERE tl.bb_league_id = :leagueID)");
    Query query2 = em.createNativeQuery(strQuery.toString(), TeamInfo.class);
    query2.setParameter("leagueID", leagueID.getId());
    List<TeamInfo> myteaminfolist = query2.getResultList();

這是TeamInfo類:

@Entity
@Table(name="bb_team_info")
@BatchSize(size=50)
public class TeamInfo implements Serializable {
private Integer id;
... some fields here ...
private TeamFinance finance;
private Manager manager;

public TeamInfo() {
}

....

@OneToOne (mappedBy="teamInfo", fetch=FetchType.LAZY)
public Manager getManager() {
    return manager;
}
...


@OneToOne(targetEntity=TeamFinance.class, fetch=FetchType.LAZY, mappedBy="teamInfo", cascade=CascadeType.ALL)
public TeamFinance getFinance() {
    return finance;
}

}

發出的實際請求(從postgresql日志中看到):

SELECT * from bb_team_info WHERE id in (SELECT bb_team_info_id FROM bb_team_league_info tl WHERE tl.bb_league_id = $1)

這正是我們所期望的,但是隨后我看到了許多這樣的查詢:

select ... from bb_team_finances teamfinanc0_ where teamfinanc0_.bb_team_info_id=$1...
select ... from bb_manager where manager0_.bb_team_info_id=$1...
select ... from bb_team_finances teamfinanc0_ where teamfinanc0_.bb_team_info_id=$1...
select ... from bb_manager where manager0_.bb_team_info_id=$1...

如果訪存類型設置為惰性,為什么休眠選擇這些表? 為何至少在兩個查詢中不這樣做(首先選擇所有經理,然后選擇財務)?

如果該實體不“擁有”它們,則Hibernate必須熱切地獲取該實體的OneToOne關系。 這是因為它需要知道是對關系還是對代理/實體使用null

為了在兩個查詢中進行加載,您需要不同的提取策略。 使用@Fetch(FetchMode.SUBSELECT) 這里有一些很好的例子: https : //www.mkyong.com/hibernate/hibernate-fetching-strategies-examples/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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