Hibernate的fetch问题,都琢磨一晚上了

07-05-13 lizarb
    

xml里lazy设置true,java里这么写:

result = s.createCriteria(JtsUser.class)
          .setFetchMode("jtsHistories", FetchMode.JOIN)
	 .add(Restrictions.idEq(2))
	 .list();

此时result.size为4,但xml里lazy设置false,java里这么写

result = s.createCriteria(JtsUser.class)
	 .add(Restrictions.idEq(2))
	 .list();

result.size就为1了,按理说两种写发是等价的.

附:JtsUser包含jtsHistories,idEq(2)的JtsUser对应4个jtsHistory记录

    

banq
2007-05-14 09:34

lazy懒加载是Hibernate最重要功能之一,怎么能说前后写法是等价的,建议好好研究lazy设置为true和false涉及的一系列重要区别。

lizarb
2007-05-14 15:04

lazy=true之后设置.setFetchMode("jtsHistories", FetchMode.JOIN)不就是把对象fetch出来了吗,也不就是等价于lazy=false了吗?两种写法都可以把子对象fetch出来,可是我不明白为什么结果list长度不一样,说的不对的地方还请指教

banq
2007-05-15 14:20

lazy=true以后,一个对象下的List就可能一次性全部取出,而设置false,则不是一次性取出,List实际是一个代理对象,只有外界访问这个List是,Hibernate才真正访问数据库