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