org.hibernate.HibernateException при миграции из Spring 3 в Spring 4 - PullRequest
3 голосов
/ 06 января 2020

Я переносю приложение из 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: не удалось зафиксировать транзакцию Hibernate; Вложенное исключение - org.hibernate.TransactionException: ошибка фиксации

Содержащий класс является классом 'Dao' и аннотируется как @ Repository.

Прежде всего, это моя миграция код правильный? Во-вторых, что вызывает исключение и как его исправить?

1 Ответ

1 голос
/ 07 января 2020

Это может быть из-за закрытия сеанса. В методах с управляемой транзакцией 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...