我正在使用 Spring 3.0.5、Hibernate 3.6.7 和 Vaadin。
我有一个像这样的简单实体
@Entity
public class Foo {
@OneToMany(fetch = FetchType.LAZY)
private Collection<Bar> bars;
...
}
我有一个从上下文中获取的对话框窗口,它应该显示“foo”中的“条”。
@Component
@Scope("prototype")
public class FooBarDialogImp extends Window implements FooBarDialog {
@Transactional(readOnly = true)
public void populate(Foo foo) {
...
for (Bar bar : foo.getBars()) {
// populate the dialog with bar information
...
}
}
}
当用户要求显示 foo 栏时,我会这样做
public class FooController {
...
public void showFooBars(Foo foo) {
FooBarDialog dialog = context.getBean(FooBarDialog.class);
dialog.populate(foo);
showDialog(dialog);
}
}
但问题是我从 hibernate 中收到“无 session ”异常。我更改了代码以注入(inject) session 工厂并查看是否存在绑定(bind) session ,确实如此。我不知道我做错了什么。有人有想法吗?
最佳答案
您将集合的关联类型指定为 LAZY,因此在调用所属对象上的 getter 方法之前不会加载它。执行此操作需要注意的是,它需要位于 session 范围内,无论是创建它的原始 session 还是新 session 。使用新 session 加载惰性列表的警告是,您的实体被视为与其分离,并且首先需要是 merged然后您可以调用以获取惰性集合。
所以只需调用:
session.merge(foo);
在尝试迭代其条
之前。
关于java - Hibernate "no session or session was closed"即使在事务方法中绑定(bind)了 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9522459/