【问题标题】:org.hibernate.HibernateException when migrating from Spring 3 to Spring 4从 Spring 3 迁移到 Spring 4 时出现 org.hibernate.HibernateException
【发布时间】: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版本无关。 .

标签: java spring hibernate


【解决方案1】:

这可能是因为会话已关闭。在 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多