java - FetchType.EAGER 执行时间很多

标签 java hibernate jpa

在我的实体中,我必须使用 fetch = FetchType.EAGER 因为我有一个错误:

nested exception is org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: "field should haver FetchType.EAGER", could not initialize proxy - no Session

如果我使用这个,那么我的应用程序会正确,但执行时间太长,页面与页面之间大约7秒(现在bbdd数据很少)

我有两个问题。

  • 如果我放置 FetchType.LAZY,我的应用程序将无法运行
  • 如果我放置 FetchType.EAGER,我的应用程序有很多执行时间

PF.class(实体)

@OneToMany(fetch = FetchType.EAGER, mappedBy = "pf", cascade = CascadeType.ALL)
private Set<HDSEntity> hardwareDeviceStocks = new HashSet<HDSEntity>();

@OneToMany(fetch = FetchType.EAGER, mappedBy = "pf", cascade = CascadeType.ALL)
private Set<BSEntity> bS = new HashSet<BSEntity>();

@OneToMany(cascade = CascadeType.ALL, mappedBy = "pf", fetch = FetchType.EAGER)
private Set<CEntity> cp = new HashSet<CEntity>();

HDS.class(实体)

 @ManyToOne(cascade = {CascadeType.ALL})
 @JoinColumn(name = "fk_pf")
 private PFEntity pf;

BS.class(实体)

@ManyToOne(cascade = CascadeType.ALL)
 @JoinColumn(name = "fk_pf")
 private PFEntity pf;

谢谢。 ;)

最佳答案

尝试阅读此相关问题,这与您面临的问题几乎相同:

Hibernate Criteria returns children multiple times with FetchType.EAGER

根据上述问题给出的答案,正确的做法是继续使用 EAGER 获取类型以避免 LazyInitiationException,但是您必须检查您的选择查询并添加一些 OUTER JOIN 以减少查询结果。

了解 hibernate 上的这种行为也发生在 native SQL 查询中非常重要,因为它导致分页速度如此之慢。尝试研究一些 SQL OUTER JOIN 来最大限度地减少分页执行时间。

关于java - FetchType.EAGER 执行时间很多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22251511/

相关文章:

java - 如何使用 JPA 映射 Map<EnumType, Double>?

java - 双击打不开jar文件

java - 如何将 List<List<String[]>> 转换为 String[][][]?

hibernate - GORM IdentityEnumType 与 Grails 2.5.6 映射 NPE

java - 我已经完成了我的 JEE Hibernate 开发,如何将我的数据库部署到生产环境中?

java - 如何检查你是否仍然使用 jpa 连接到数据库

java - 如何使用 CRUDRepository 保存列表但最后提交

java - 如何在 for 循环中更改属于某个类的变量? ( java )

hibernate - 如何为 Spring Data JPA 中的所有查询创建动态 WHERE 子句?

hibernate - 通过 hibernate 删除时出现 StaleStateException