我正在使用Spring 3.0.5,Hibernate 3.6.7和Vaadin。
我有一个像这样的简单实体
@Entity
public class Foo {
@OneToMany(fetch = FetchType.LAZY)
private Collection<Bar> bars;
...
}
我有一个对话窗口,我从上下文中得到它应该显示'foo'中的'bars'。
@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获得了“无会话”异常。我更改了代码以注入会话工厂并查看是否存在绑定会话,并且确实如此。我不知道我做错了什么。有人有想法吗?
答案 0 :(得分:8)
您将集合的关联类型指定为LAZY,因此在调用拥有对象的getter方法之前不会加载它。这样做的警告是它需要在会话的范围内,无论是创建它的原始会话还是新会话。并且使用新会话加载惰性列表的警告是,您的实体被认为与其分离,并且首先需要merged才能调用以获取延迟集合。
所以请致电:
session.merge(foo);
在尝试迭代其bars
之前。