我知道这是一个经典问题,但不知怎的,我无法想出如何解决这个问题。
所以我在两个实体A和B之间有一个OneToMany关系。
在A中我有以下方法:
@OneToMany(cascade=CascadeType.ALL, mappedBy = "a")
public Set<B> getBList() {
return this.bList;
}
在控制器的某个地方,在处理程序方法中我有类似
的东西@RequestMapping("/")
public String method(Model model){
A a = aDAO.findById(1);
for(B b : a.getBList()){
System.out.println(b);
}
model.addAttribute("a",a);
}
在jsp页面中我有以下EL:
${a.bList}
在处理程序方法中,一切正常,A对象所具有的B对象列表在控制台中正确显示。
但是在渲染jsp页面时,会出现LazyInitializationException:
org.hibernate.LazyInitializationException:懒得初始化角色集合:com.entities.A.bList,没有关闭会话或会话
我理解这个例外通常会出现(如果我错了,请纠正我),因为获得A的会话在此期间已经关闭。 但是在DAO类的findById(Long id)方法中,我没有关闭会话。 我猜这就是处理程序方法中的打印工作原因。但那么为什么EL会引起异常呢?会话是否在解释JSP页面时关闭?
此外,如何才能访问EL中的列表?
答案 0 :(得分:0)
正如您所提到的,这是hibernate会话的问题,因为它需要在hibernate事务中执行方法,您需要将@Transactional属性写入您的dao方法。