FetchType.EAGER执行了很多时间

时间:2014-03-07 13:33:17

标签: java hibernate jpa

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

感谢。 ;)

2 个答案:

答案 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更正您的查询。