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


嵌套的异常是org.hibernate.LazyInitializationException:失败
延迟初始化角色集合:
“字段应具有FetchType.EAGER”,
无法初始化代理-没有会话


如果我使用它,那么我的应用程序将正确运行,但是时间执行也是正确的,在页面和页面之间大约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来减少查询结果。

了解休眠状态下的这种行为在本机SQL查询中也会发生,这一点非常重要,因为它使您的分页非常慢。也尝试研究一些SQL OUTER JOIN,以最大程度地减少分页执行时间。

10-07 22:29