使用Lazy集合的Hibernate LazyInitializationException

时间:2012-01-15 21:29:20

标签: hibernate


我实际上遇到了Hibernate的问题。我必须说我对此有点新鲜,但我所拥有的代码已经存在并由知道Hibernate的人构建。问题是我正在尝试将Hibernate版本从v3.2.5迁移到3.6.9。实际存在的代码100%工作,但是当我更改了JAR和所有已弃用的功能时,相同的代码不再起作用。所以,这是我的问题:
我有一个Client对象,它与Status有多对多的关联(我们保留状态的历史记录)。默认情况下,此集合是LAZY。但是,当我进行客户端研究时,我需要这些信息,因此我使用了Criteria API。然后我将状态集合设置为EAGER,如下所示:

Criteria lStatuCriteria = lIntrvCriteria.createCriteria(SimIntrv.SIM_STATU_INTRVS, Criteria.LEFT_JOIN);

然后我使用Restrictions.in()函数来过滤状态。问题是,在3.2.5中,当调用Client对象的list()函数时,正确加载了集合(在配置文件中设置为lazy)。另一方面,在3.6.9中,未加载集合。我尝试使用setFetchMode设置fetchmode,但它不起作用。

任何线索?

2 个答案:

答案 0 :(得分:0)

当您加入状态并对其进行过滤时,hibernate期望查询不会返回所有状态,也不会初始化集合。我想在旧版本中,在客户端通过某个地方的getter加载之后,状态会被另一次往返获取,而现在已经不存在了。

答案 1 :(得分:0)

我建议使用lStatuCriteria.setFetchMode(“mate”,FetchMode.EAGER)将Fetch模式用作标准中的渴望。