На ум приходит пара возможностей (без каламбура):
a) Ваш драйвер JDBC по умолчанию имеет значение autocommit = true и каким-то образом игнорирует вызовы beginTransaction () и rollback ();
b) Если вы используете Spring 3, я считаю , что SessionFactory.getSession () возвращает объект Hibernate Session, заключенный в прокси Spring. Прокси-сервер Spring настроен на Session частично для управления транзакциями, и, возможно, возможно, что он мешает вашим ручным вызовам транзакций?
Хотя вы, безусловно, можете использовать прокси в области AOP для управления транзакциями, почему бы не использовать аннотацию @Transactional (readOnly = false | true) в ваших методах уровня обслуживания? В вашем конфигурационном файле Spring для методов уровня обслуживания все, что вам нужно сделать, чтобы сделать эту работу, это добавить
<tx:annotation-driven />
См. Главы 10 и 13 справочной документации Spring по управлению транзакциями и доступу к данным ORM соответственно:
http://static.springsource.org/spring/docs/3.0.x/reference/index.html
Наконец, если вы используете Spring 3, вы можете исключить ссылки на Spring Framework в своем коде, вставив bean-компонент SessionFactory в Spring-прокси в ваш код DAO - больше нет необходимости использовать HibernateDaoSupport. Просто введите SessionFactory, получите текущий сеанс и используйте Hibernate в соответствии с примерами Hibernate. (При необходимости вы можете комбинировать как HibernateDaoSupport, так и простой код Hibernate на основе SessionFactory в одном приложении.)