Я переносю приложение из 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.
Прежде всего, это моя миграция код правильный? Во-вторых, что вызывает исключение и как его исправить?