2012-01-15 49 views
1


我实际上遇到了Hibernate的一个问题。我必须说我对此有点新,但我拥有的代码已经存在,并且由知道Hibernate的人构建。问题是我试图将Hibernate版本从v3.2.5迁移到3.6.9。实际的代码可以工作100%,但是当我更改JAR和所有弃用的功能时,相同的代码不再适用。所以,这里是我的问题:
我有一个Client对象,它与Status(我们保留状态的历史记录)具有多对多关联。默认情况下,这个集合是LAZY。但是,当我做客户研究时,我需要这些信息,所以我使用了Criteria API。我当时状态的集合设为跃跃欲试,像这样:带懒惰集合的Hibernate LazyInitializationException

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

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

任何线索?

+0

向我们展示更多您的代码。我认为你的代码依赖于一个现在固定的Hibernate bug来正常工作。使用setFetchMode应该可以工作,但这一切都取决于你是否正确使用它。没有看到代码,就不可能说。 – 2012-01-16 09:32:47

回答

0

当您加入状态并对其进行过滤时,hibernate预计并非所有状态都将由查询返回并且不会初始化该集合。我猜旧版本中的状态会在客户端通过某个地方的getter加载并且现在不再存在时以另一次往返方式获取。

0

我建议使用lStatuCriteria.setFetchMode(“mate”,FetchMode.EAGER)在标准中使用Fetch模式。

+0

FetchMode.EAGER是不推荐使用的功能。 FetchMode.JOIN。这不是一个选项,因为它意味着很多修改 – 2012-01-18 20:15:30

相关问题