java - 即使 fetchtype 是惰性的,JPA 也会加载太多数据
问题描述
我有一个加载与下水道网络相关的数据的应用程序。以下是涉及的实体示例。首先,我定义一个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 应该可以工作,但如果您使用 JPA 存储库和 @Query on repository 方法并编写您的查询然后 Lazy 可能无法正常工作。
推荐阅读
- json - 如何在json中解析前面没有双引号的字符串对象
- python - Flask WTForms BooleanField UnboundField
- julia - 您如何按字典的值对字典进行排序,然后将这些值相加到某个点?
- r - 应用于主题建模时“增强”背后的细节
- oracle - 用于内部连接和 where 子句的 PL/SQL 过程
- r - R - `try`结合捕获所有控制台输出?
- angular - 加载ag-grid树视图时,我们如何默认第一级展开?
- java - URLDecoder:多部分数据的转义 (%) 模式中的非法十六进制字符
- powershell - PowerShell ISE 中的 XAML 代码在 Visual Studio Code 中不起作用
- jupyter-notebook - 使用 Google Colab 通过 HTTPS 连接到远程 Jupyter 运行时