今天在学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到底是在什么情况下才会用呢?hibernatejava

解决方案 »

  1.   

    如果类集合属性(users)里包含十万,甚至百万的记录,在初始持久化实体的同时,完成所有集合属性的初始化,会导致性能急剧下降。所以lazy=true通常用于取一些包含大量其他实体数据的实体时用的
      

  2.   

    Hibernate的检索策略包括类级别检索策略和关联级别检索策略。类级别检索策略有立即检索和延迟检索,默认的检索策略是立即检索。在Hibernate映射文件中,通过在<class>上配置 lazy属性来确定检索策略。对于Session的检索方式,类级别检索策略仅适用于load方法;也就说,对于get、qurey检索,持久化对象都会 被立即加载而不管lazy是false还是true.
    原文:点击查看http://blog.sina.com.cn/s/blog_6c673bfb010122us.html
      

  3.   

    考虑到性能的问题,配置OpenSessionInView可以实现需要数据就去取的目的。。