could not initialize proxy - no Session
的错误,一般出现在我们获取一些实体的oneToMany
或manyToMany
属性时。这是由于JPA在查询完毕后,立即释放了session(实现了连接数据库并查询数据的功能)
. 而当我们查询完毕后,再想获取实体中的一些信息时,便发生了上述错误。
示例
比如:
// 班级
class Klass {
...
@OneToMany
private List<Student> studentList;
...
}
Klass klass = klassRepository.findOneById(1L); // 开启session,查询,关闭session
klass.getStudents(); // 此时session已关闭,发生错误。
解决方法
1) 设置不要查询后就关闭session
:该方法不推荐,特别是小白。具体方法不阐述。
2) 设置lazy
属性.该方法适用于大部分情景。
class Klass {
...
@OneToMany
@Lazy(false)
private List<Student> studentList;
...
3) 设置fetch
属性: 该方法适用于第2种解决方法不生效时.
class Klass {
...
@OneToMany(fetch = FetchType.EAGER)
private List<Student> studentList;
...