gpt4 book ai didi

java - Hibernate 加载一一不需要的标记为延迟获取类型的实体

转载 作者:行者123 更新时间:2023-11-30 06:52:13 25 4
gpt4 key购买 nike

通过hibernate使用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 会选择这些表?为什么它至少不会在两个查询中执行此操作(首先选择所有经理,然后选择财务)?

最佳答案

如果实体不“拥有”它们,Hibernate 必须急切地获取实体的 OneToOne 关系。这是因为它需要知道是否对关系或代理/实体使用 null

要在两个查询中进行加载,您需要不同的获取策略。使用@Fetch(FetchMode.SUBSELECT)。以下是一些很好的示例:https://www.mkyong.com/hibernate/hibernate-fetching-strategies-examples/

关于java - Hibernate 加载一一不需要的标记为延迟获取类型的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42533467/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com