在我的实体中,我必须使用 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/