我正在将应用程序从Spring 3迁移到Spring4。特别是,我将其迁移到
<spring.version>4.2.9.RELEASE</spring.version>
<org.springframework.ws.version>3.0.8.RELEASE</org.springframework.ws.version>
<hibernate.version>4.3.11.Final</hibernate.version>
这里是Spring 3的原始代码:
public AcmeUserBean loadUserByDn(String userDn) {
AcmeUserBean result = null;
Session session = null;
try {
session = this.currentSession();
Transaction tx = session.beginTransaction();
Query query = session.createQuery(
"from AcmeUserBean as user where user.distinguishedName = :userDn");
query.setString("userDn", userDn);
List objs = query.list();
if (objs != null && objs.size() > 0) {
result = (AcmeUserBean) objs.get(0);
}
tx.commit();
session.close();
return result;
} finally {
if (session != null) {
session.flush();
session.close();
}
}
}
在Spring 4中,我将其更新为:
@Transactional
public AcmeUserBean loadUserByDn(String userDn) {
AcmeUserBean result = null;
Session session = null;
try
{
session = this.getSessionFactory().getCurrentSession();
Query query = session.createQuery(
"from AcmeUserBean as user where user.distinguishedName = :userDn");
query.setString("userDn", userDn);
List objs = query.list();
if (objs != null && objs.size() > 0) {
result = (AcmeUserBean) objs.get(0);
}
return result;
} finally {
if (session != null) {
session.flush();
session.close();
}
}
}
方法中的每一行都成功,并且返回行上的result
不为null。但是,方法退出时会发生异常:
org.springframework.transaction.TransactionSystemException:无法进行休眠事务;嵌套异常为org.hibernate.TransactionException:提交失败
包含类是一个'Dao'类,并注释为@Repository。
首先,我的代码迁移正确吗?其次,是什么导致异常,我该如何解决?
可能是因为会话已关闭。在具有Spring托管事务(@Transactional
)的方法中,Spring将处理会话提交和会话关闭。如果执行session.close()
,将出现上述错误。评论session.close()
并尝试。
@Transactional
public AcmeUserBean loadUserByDn(String userDn) {
AcmeUserBean result = null;
Session session = this.getSessionFactory().getCurrentSession();
Query query = session.createQuery(
"from AcmeUserBean as user where user.distinguishedName = :userDn");
query.setString("userDn", userDn);
List objs = query.list();
if (objs != null && objs.size() > 0) {
result = (AcmeUserBean) objs.get(0);
}
return result;
}