[英]org.hibernate.HibernateException when migrating from Spring 3 to Spring 4
I am migrating an application from Spring 3 to Spring 4. In particular, I am migrating it to我正在将应用程序从 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>
Here is the original code that worked with Spring 3:这是与 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();
}
}
}
With Spring 4, I updated it to:在 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();
}
}
}
Each line in the method succeeds and result
is not null at the return line.方法中的每一行都成功并且result
在返回行不为空。 However, an exception occurs when the method exits:但是,该方法退出时会出现异常:
org.springframework.transaction.TransactionSystemException: Could not commit Hibernate transaction; org.springframework.transaction.TransactionSystemException: 无法提交 Hibernate 事务; nested exception is org.hibernate.TransactionException: commit failed嵌套异常是 org.hibernate.TransactionException: 提交失败
The containing class is a 'Dao' class and is annotated as @Repository.包含类是一个“Dao”类,并被注释为@Repository。
First of all, is my migration of the code correct?首先,我的代码迁移是否正确? Second, what is causing the exception and how can I fix it?其次,是什么导致了异常,我该如何解决?
It might be because of the session is closed.可能是因为会话已关闭。 In methods with Spring managed transaction ( @Transactional
) ,Spring will handle session commit and session close.在 Spring 管理事务 ( @Transactional
) 的方法中,Spring 将处理会话提交和会话关闭。 If you do session.close()
, the above error will appear.如果您执行session.close()
,则会出现上述错误。 comment session.close()
and try it.评论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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.