【发布时间】:2020-01-06 19:50:35
【问题描述】:
我正在将应用程序从 Spring 3 迁移到 Spring 4。特别是,我正在将其迁移到
<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 在返回行不为空。但是,当方法退出时会发生异常:
org.springframework.transaction.TransactionSystemException: 不能 提交休眠事务;嵌套异常是 org.hibernate.TransactionException: 提交失败
包含的类是一个'Dao'类,并被注释为@Repository。
首先,我的代码迁移是否正确?其次,是什么导致了异常,我该如何解决?
【问题讨论】:
-
删除
try/finally。 Spring 正在管理会话,您不应该干预它。但是为什么要更改代码,如果它适用于Spring 3,它仍然适用于Spring 4。我会先升级Spring然后优化代码,优化代码与Spring版本无关。 .