尝试添加
@Transactional到validate方法:
@Override@Transactional(readonly=true)public void validate(Object target, Errors errors) { ...}发生的事情是,因为没有
@Transactional注释,所以没有与该方法关联的会话,并且每个查询都将在其自己的会话中运行,该会话随后将立即关闭。
该方法
session.load()始终返回一个代理,与之不同
session.get()(请参阅此处,了解load与get之间的差异)。
因此,返回了代理,但是由于缺少
@Transactional代理,因此立即关闭了创建代理的会话。第一次访问代理时,它的会话已关闭,因此我们收到“无会话”错误。
如果从更改
load()为
get(),则只能部分解决问题,因为如果在get之后尝试加载例如惰性初始化集合,则异常会再次发生。
添加
@Transactional到业务方法将确保在方法调用期间存在相同的会话,并防止发生此错误和其他相关错误。



