Я представил HibernateTransactionManager в своем проекте, потому что нам нужно использовать транзакции для некоторых методов обслуживания. Я также следовал наилучшей практике, чтобы внедрить SessionFactory в слой DAO вместо реализации HibernateDaoSupport.
Теперь в некоторых методах чтения, которые не аннотируются с @Transactional, я получил ошибку:
No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
Я знаю, как его решить, просто добавьте @Transactional повсюду. Но мои коллеги беспокоятся о производительности. Следует также читать такие методы, как:
return sessionFactory.getCurrentSession().createCriteria(MyClass.class).add(Restrictions.eq("color", color)).addOrder(Order.asc("createDate")).list();
аннотироваться с помощью @Transactional?
Я также прочитал этот пост. Некоторые пояснения к примечанию Spring @Transactional о методе, который препятствует использованию этой аннотации в слое DAO, поэтому я не вижу, что является наилучшей практикой для избавления от проблемы. И имеют хорошие показатели при чтении методов.
Большое спасибо за помощь!
Когда вы используете абстракцию Spring TransactionManager, вы всегда должны отмечать все методы службы:
@Transactional
@Transaction(readOnly = true)
для методов только для чтения Это связано с тем, что Hibernate больше не будет управлять транзакцией, но вместо этого он делегирует эту ответственность на платформу Spring. Если вы не помечаете каждый метод границ @Transactional
аннотацией @Transactional
, Spring не может связывать текущий поток с @Transactional
Hibernate и связанным с ним соединением JDBC.
Таким образом, использование @Transactional
не является вариантом.