日期:2014-05-19  浏览次数:20627 次

关于hibernate中lazy的一点疑惑
今天在学hibernate的时候遇到一个异常:
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
网上搜到的解决办法是设置lazy=false。
问题虽然解决了,但我有个疑问:延迟加载的作用是在程序未调用前,由hibernate生成一个代理对象,调用时再从数据库读取。但是在调用的时候,dao里面事务已经提交了,session也关闭了,不是明摆着报异常么...
比如说如下代码:
User.java

....
private UserGroup userGroup ;
....

UserGroup.java

....
private Set<User> users ;
....

UserDao.java

...
public User getById(int id) {
Session session = getSession() ;
User user = (User) session.get(User.class, id) ;
return user;
}
...

UserGroup.hbm.xml

        <set name="users" table="DF_USER" inverse="false" lazy="true">
            <key>
                <column name="[USERGROUP_ID]" />
            </key>
            <one-to-many class="test.model.User" />
        </set>
        </set>

如果在UserService.java中这么写的话就会有异常:

...
User u = userDao.getById(1);
UserGroup ug = u.getUserGroup() ;
...

想请教下,lazy=true到底是在什么情况下才会用呢?
hibernate java

------解决方案--------------------
如果类集合属性(users)里包含十万,甚至百万的记录,在初始持久化实体的同时,完成所有集合属性的初始化,会导致性能急剧下降。所以lazy=true通常用于取一些包含大量其他实体数据的实体时用的
------解决方案--------------------
当访问的数据量过大时,使用懒加载。因为内存空间是有限的,一次读入太大的数据会降低性能。
------解决方案--------------------
Hibernate的检索策略包括类级别检索策略和关联级别检索策略。

类级别检索策略有立即检索和延迟检索,默认的检索策略是立即检索。在Hibernate映射文件中,通过在<class>上配置 lazy属性来确定检索策略。对于Session的检索方式,类级别检索策略仅适用于load方法;也就说,对于get、qurey检索,持久化对象都会 被立即加载而不管lazy是false还是true.
原文:点击查看http://blog.sina.com.cn/s/blog_6c673bfb010122us.html
------解决方案--------------------
考虑到性能的问题,配置OpenSessionInView可以实现需要数据就去取的目的。。