在JSP EL

时间:2016-09-08 11:24:32

标签: hibernate jsp one-to-many el lazy-initialization

我知道这是一个经典问题,但不知怎的,我无法想出如何解决这个问题。

所以我在两个实体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中的列表?

1 个答案:

答案 0 :(得分:0)

正如您所提到的,这是hibernate会话的问题,因为它需要在hibernate事务中执行方法,您需要将@Transactional属性写入您的dao方法。