gpt4 book ai didi

java - 即使 fetchtype 是惰性的,JPA 也会加载太多数据

转载 作者:行者123 更新时间:2023-12-02 11:08:19 25 4
gpt4 key购买 nike

我有一个加载与下水道网络相关的数据的应用程序。以下是所涉及实体的示例。首先,我定义一个 Network 实体:

@Entity
@Table(name = "network")
public class Network extends Serializable {
@Id
@generatedValue(strategy=GenerationType.AUTO)
private Long id;

...
@OneToMany(mappedBy = "network")
private List<Conduit> conduits;

@OneToMany(mappedBy = "network")
private List<ConduitVolumeter> conduitVolumeters;

...
}

涉及的第二个实体是Conduit,它代表网络中的管道。

@Entity
@Table(name = "conduit")
@NamedQuery(name = "Conduit.findAll", query = "SELECT c FROM Conduit c")
public class Conduit extends Serializable {
@Id
@generatedValue(strategy=GenerationType.AUTO)
private Long id;

...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id_network", nullable = false)
private Network network;

@OneToOne(mappedBy = "conduit", fetch = FetchType.LAZY)
private ConduitVolumeter conduitVolumeter;

...
}

接下来,我定义ConduitVolumeter。这代表用于测量管道中的体积的测量装置。由于可以在其他网络项目中测量流量,因此有一个与数据库中的 volumeter 表关联的抽象类 Volumeter

@Entity(name = "ConduitVolumeter")
@DiscriminatorValue("1")
public class ConduitVolumeter extends Volumeter {

@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id_nme")
private Conduit conduit;

...
}

@Entity
@Table(name = "volumeter")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "nme_type", discriminatorType = DiscriminatorType.INTEGER)
public abstract class Volumeter extends Serializable {
@Id
@generatedValue(strategy=GenerationType.AUTO)
private Long id;

...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id_network", nullable = false)
private Network network;

...
}

问题是,当我尝试加载与网络关联的所有管道时,Hibernate 会根据其日志尝试系统地加载与每个已加载管道关联的每个卷计器,一次一个。

Hibernate: 
select
conduit0_.id as id_1_7_,
conduit0_.name as name23_7_,
conduit0_.id_network as id_netw39_7_,
from
conduit conduit0_ cross
join
network network1_
where
conduit0_.id_network=?

...

Hibernate: 
select
conduitvol0_.id as id2_116_0_,
conduitvol0_.name as name10_116_0_,
conduitvol0_.id_network as id_netw15_116_0_,
conduitvol0_.id_nme as id_nme17_116_0_
from
volumeter conduitvol0_
where
conduitvol0_.id_nme=?
and conduitvol0_.nme_type=1

我的问题:为什么 Hibernate 尝试加载体积计数据?每个 @ManyToOne@OneToOne 注释均使用 FetchType.LAZY 设置。我错过了什么?

顺便说一句,我被要求将 JPA 与旧数据库一起使用。是数据库模型的问题吗?有没有办法在没有体积计的情况下加载导管?

问候。

弗朗索瓦

最佳答案

FetchType 只是一个提示。这取决于您如何查询数据,如果您使用 spring-data-jpa 存储库方法,如 findOne 或 findBy 方法(派生查询),那么 Lazy 应该可以工作,但如果您在存储库方法上使用带有 @Query 的 JPA 存储库并编写您的查询那么 Lazy 可能不起作用。

关于java - 即使 fetchtype 是惰性的,JPA 也会加载太多数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50762240/

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