在我的实体中,我必须使用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,以最大程度地减少分页执行时间。