在我的实体中,我必须使用fetch = FetchType.EAGER,因为我有一个错误:
嵌套异常是org.hibernate.LazyInitializationException:失败 懒惰地初始化角色集合: “字段应该有FetchType.EAGER”, 无法初始化代理 - 没有会话
如果我使用这个,那么我的应用程序是正确的,但是时间执行也是如此,页面和页面之间大约7秒(现在bbdd几乎没有数据)
我有两个问题。
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;
感谢。 ;)
答案 0 :(得分:1)
尝试阅读此相关问题,这几乎与您面临的问题相同:
Hibernate Criteria returns children multiple times with FetchType.EAGER
根据上面问题给出的答案,正确的做法是继续使用EAGER获取类型以避免LazyInitiationException,但是您必须检查您的选择查询并添加一些OUTER JOIN以减少查询结果。
理解hibernate上的这种行为也发生在本机SQL查询中非常重要,这是因为它的分页速度太慢了。尝试研究一些SQL OUTER JOIN也可以最小化您的分页执行时间。
答案 1 :(得分:0)
尝试使用FetchType.LAZY,但使用inner join fetch
更正您的查询。