关于hibernate中lazy=true

目前还不是很清楚lazy=true在hibernate中是如何处理从而达到提高效率的,是在get的时候去进行数据库查询,还是说别的手段?它自己实现的Collection的作用是什么?

如果一个对象通过webservice传递到了客户端,那么他在getXxxs()去一个集合的时候有没有什么问题?

lazy=true, Hibernate在底层实现了一个Proxy类,如果需要用到类的时候再装入。这跟一般的lazy load是一样的,在分布式应用中,如果用到Hibernate自已的collection 也同时用到lazy=true, 则一定要注意,这是不可能再实现lazy load的, 所以一定要在传给client端之前,全部装载所有要用到类,再传送。 不过这也要根据情况,如果确信client端并不可能用到所用的类,则不用全部装载。希望没有越说越糊涂。另外lazy=true且有继承关系的时候,要注意转型的问题。

什么样的类,才会“如果需要用到类的时候再装入”?

能举个小例子吗说明吗?

谢谢

例如 一个类A中“可能“ ”在将来”才要用到另一个类B中的方法,在装入类A时,不一定要装入类B, 当类A需要类B时,再把类B装入。

具体的东西可以看看下面的连接:

http://www.hibernate.org/hib_docs/reference/html_single/collections-s1-7

例如 一个类A中“可能“ ”在将来”才要用到另一个类B中的方法,在装入类A时,不一定要装入类B, 当类A需要类B时,再把类B装入。

具体的东西可以看看下面的连接:

http://www.hibernate.org/hib_docs/reference/html_single/collections-s1-7

按照它的例子:
s = sessions.openSession();
User u = (User) s.find("from User u where u.name=?", userName, Hibernate.STRING).get(0);
Map permissions = u.getPermissions();
s.connection().commit();
s.close();

Integer accessLevel = (Integer) permissions.get("accounts"); // Error!

这个permissions应该是被lazy的类
它上面说,permissions应该放到commit前才正确,
那我看不出来什么地方用到了lazy???

恩 楼上的,正是因为lazy=true 所以没有载入 但在session 关闭后 有需要载入 所以error! 如果放在session.close之前 就ok!

关于这个lazy 挺好也有不方便的时候,就好比我为了添加parent的一个child,我在一个session载入的parent时候 不得不一个一个载入parent的child, 之后在这个session关闭后 , 在另一个session中 才可以用到parent.getchilds().add(child) ,不然就会报错!

不知道大家是怎么用代码载入的 我使用循环一个一个的载入


for(Iterator ite=parent.getchilds().iterator;ite.hasnext()){
ch=(child)ite.next();
}

有没有什么其他的方法?


还有一个问题 在处理分页的时候


q=session.createQuery(hql);
q.setFirstResult(firstResult);
q.setMaxResults(count);

这个只是可以得到当前页面上的纪录数 ,我怎么得到总的记录数呢?不能我再做一边
q=session.createQuery(hql);
得到总的记录数吧! 大家使用什么办法的?

问题已得到解决

说说啊,怎么解决?

在hibernate文档说它是利用runtime bytecode enhancement来实现lazy load的。但我就不明白了,hibernate怎么能知道我的代码执行了get方法?