java - Hibernate "no session or session was closed"即使在事务方法中绑定(bind)了 session

标签 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”中的“条”。

@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/

相关文章:

java - 如何使用链表进行选择排序

java - 在 Spring Boot 应用程序中配置 GCP 凭据的首选方法是什么

java - JavaFX 应用程序的自定义窗口

java - Netbeans Java 控制台编码 UTF-8 和变音符号

java - spring security ldap隐藏密码属性

java - Spring JDBCTemplate 执行不抛出异常

oracle - 有多个 sessionFactory 实例

spring - 如何刷新Grails中的数据库对象列表?

java - 如何编写多行HQL代码?

java - 如何使用Hibernate-Search在ElasticSearch中将Set <Entity>序列化为字符串数组?