我正在使用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
。
为什么这段代码不起作用,我怎样才能在需要时加载一个集合?
我不想用指定的方法编写服务来加载集合,这不是解决方案。
答案 0 :(得分:3)
延迟加载不仅需要一个会话,它需要 <{1}}附加到的会话。在尝试访问惰性字段之前,需要将对象附加到Entity
创建的新会话。
此外,虽然您显然无法使用其中一个可用的OSIV servlet过滤器,但“模式”仍然有效。必须有一些可定义的范围,您可以将会话的生命周期耦合到。 (它可能证明是如此之大,以至于还有其它挑战使得它不值得付出努力,但它仍然是一种选择。)
答案 1 :(得分:0)
E.g。你有User user
个对象。它是分离的,这就是为什么你得到“例外是没有会话或会话被关闭”。
您可以从dao user=userDao.findById(user.getId())
重新读取它,然后获取新检索对象的延迟集合。