org.hibernate.HibernateException从Spring 3迁移到Spring 4时

问题描述 投票:1回答:1

我正在将应用程序从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。

首先,我的代码迁移正确吗?其次,是什么导致异常,我该如何解决?

java spring hibernate
1个回答
0
投票

可能是因为会话已关闭。在具有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;
}
© www.soinside.com 2019 - 2024. All rights reserved.