当前位置: 首页 > 知识库问答 >
问题:

组织。冬眠从Spring 3迁移到Spring 4时出现HibernateeException

穆修杰
2023-03-14

我正在将一个应用程序从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();
        }
    }
}

方法中的每一行都成功,并且返回行的结果不为空。但是,当方法退出时会发生异常:

org.springframework.transaction.TransactionSystemException:无法提交Hibernate事务;嵌套异常org.hibernate.TransactionException:提交失败

包含的类是一个“Dao”类,并被注释为@Repository。

首先,我的代码迁移正确吗?第二,是什么导致了异常,我如何修复它?

共有1个答案

井斌斌
2023-03-14

这可能是因为会话已关闭。在使用Spring管理的事务(@Transactional)的方法中,Spring将处理会话提交和会话关闭。如果您执行会话。close(),将出现上述错误。注释会话。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;
}
 类似资料: