在JSP文件之外的事务边界之外使用时,使用spring和hibernate的惰性初始化异常

时间:2018-04-18 21:52:20

标签: java spring hibernate

我正在使用spring 4.0和hibernate 4.3,

问题在于,如果我通过session.openSession()获取hibernate会话对象,那么我可以在任何地方初始化包含JSP的惰性对象,但是我必须通过自己来管理hibernate的会话对象,这是错误的做法。 / p>

但是,如果我通过session.getCurrentSession()创建会话,那么我得到spring为我管理会话的好处,但后来发生这个问题,我不能懒惰地将对象初始化为像JSP这样的事务边界。

每次我不想将域对象注释更改为Eager时,我也不希望每次为每个惰性对象显式设置查询获取模式为eager或join。

总的来说,我只是想问一下,当与spring和hibernate一起使用时,处理延迟初始化对象的正确方法是什么。请帮忙

1 个答案:

答案 0 :(得分:0)

以下是我在需要时获取延迟加载数据的逻辑。

import java.io.Serializable;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate4.HibernateTemplate;
import org.springframework.stereotype.Service;




    public class UserDAO implements GenericDao<User,String> {

        @Autowired
        private HibernateTemplate template;

        @Override
        public User load(final String id) {
            return template.load(User.class,id);
        }

        @Override
        public User get(final String id) {
            return template.get(User.class,id);
        }

        public User getUserVideos(final String id) {
            User user = template.get(User.class,id);
            template.initialize(user.getVideo());
            return user;
        }



        @Override
        public Long count() {
            return new Long(template.loadAll(User.class).size());
        }

        @Override
        public void flush() {
            template.flush();
        }

    }

您可以在JSP中或您想要的任何地方使用返回的对象