Hibernate“没有会话或会话被关闭”,即使在Transactional方法中绑定了Session

时间:2012-03-01 19:15:00

标签: java spring hibernate transactions transactional

我正在使用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获得了“无会话”异常。我更改了代码以注入会话工厂并查看是否存在绑定会话,并且确实如此。我不知道我做错了什么。有人有想法吗?

1 个答案:

答案 0 :(得分:8)

您将集合的关联类型指定为LAZY,因此在调用拥有对象的getter方法之前不会加载它。这样做的警告是它需要在会话的范围内,无论是创建它的原始会话还是新会话。并且使用新会话加载惰性列表的警告是,您的实体被认为与其分离,并且首先需要merged才能调用以获取延迟集合。

所以请致电:

session.merge(foo);

在尝试迭代其bars之前。