访问 JSP EL 中的 OneToMany 对象列表时出现 LazyInitializationException
LazyInitializationException at accessing OneToMany list of objects in JSP EL
我知道这是一个 classic 问题,但我不知道如何解决这个问题。
所以我在两个实体 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: failed to lazily initialize a collection of role: com.entities.A.bList, no session or session was closed
我知道这个异常通常会出现(如果我错了请纠正我),因为在此期间从中获取 A 的会话已经关闭。
但是在 DAO class 的 findById(Long id) 方法中,我没有关闭会话。
我想这就是处理程序方法中打印有效的原因。但是为什么会导致EL异常呢?会话是否在 JSP 页面的解释处关闭?
此外,如何才能访问 EL 中的列表?
正如您提到的,这是休眠会话的问题,因为它需要在休眠事务中执行方法,您需要将 @Transactional 属性写入您的 dao 方法。
我知道这是一个 classic 问题,但我不知道如何解决这个问题。
所以我在两个实体 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: failed to lazily initialize a collection of role: com.entities.A.bList, no session or session was closed
我知道这个异常通常会出现(如果我错了请纠正我),因为在此期间从中获取 A 的会话已经关闭。 但是在 DAO class 的 findById(Long id) 方法中,我没有关闭会话。 我想这就是处理程序方法中打印有效的原因。但是为什么会导致EL异常呢?会话是否在 JSP 页面的解释处关闭?
此外,如何才能访问 EL 中的列表?
正如您提到的,这是休眠会话的问题,因为它需要在休眠事务中执行方法,您需要将 @Transactional 属性写入您的 dao 方法。