Hibernate和Spring,加载一个处于惰性模式的集合

时间:2011-12-05 23:10:05

标签: java hibernate spring lazy-loading

我正在使用Spring通过@Transactional注释来管理服务层中的事务。 这对于急切加载的集合很好,但对于延迟加载是不好的。

我无法使用OSV模式,我的应用程序是一个独立的桌面客户端应用程序。

所以我想到了一个解决方案,这就是我尝试做的事情:

public abstract class TransactionTask {

    public TransactionTask() {
    }

    public abstract void job(); 
}

在我的服务中,我有:

@Transactional
public void doJob(Transactiontask tt){
    tt.job();
}

我如何使用它:

myService.doJob(new TransactionTask() {

    @Override
    public void job() {
        //lazy code here
    }
});

我希望看到此代码有效,因为会话在doJob方法中打开(它被标记为事务性),但它不起作用......例外是no session or session was closed。 为什么这段代码不起作用,我怎样才能在需要时加载一个集合?

我不想用指定的方法编写服务来加载集合,这不是解决方案。

2 个答案:

答案 0 :(得分:3)

延迟加载不仅需要一个会话,它需要 <{1}}附加到的会话。在尝试访问惰性字段之前,需要将对象附加到Entity创建的新会话。

此外,虽然您显然无法使用其中一个可用的OSIV servlet过滤器,但“模式”仍然有效。必须有一些可定义的范围,您可以将会话的生命周期耦合到。 (它可能证明是如此之大,以至于还有其它挑战使得它不值得付出努力,但它仍然是一种选择。)

答案 1 :(得分:0)

E.g。你有User user个对象。它是分离的,这就是为什么你得到“例外是没有会话或会话被关闭”。

您可以从dao user=userDao.findById(user.getId())重新读取它,然后获取新检索对象的延迟集合。