gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 02:21:04 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com