@Transactional не создает транзакцию hibernate
В файле бинов спринга имеются такие строки:
<context:annotation-config />
<context:component-scan base-package="com.pack"/>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
<property name="dataSource" ref="dataSource"></property>
</bean>
Боб, в котором объявлена фабрика сессий:
@Bean(name = "sessionFactory")
public LocalSessionFactoryBean localSessionFactoryBean() {
LocalSessionFactoryBean factory = new LocalSessionFactoryBean();
factory.setDataSource(dataSourceConfiguration.dataSource());
Properties props = new Properties();
props.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
props.put("hibernate.hbm2ddl.auto", "update");
// props.put("hibernate.current_session_context_class", "thread");
factory.setHibernateProperties(props);
factory.setMappingResources("com/pack/Item.hbm.xml");
return factory;
}
Бины dataSource и sessionFactory отдельно работают нормально, думаю, проблема не в них. Имеется DAO:
@Repository(value = "itemDaoHibernateImpl")
public class ItemDaoHibernateImpl implements ItemDao {
@Resource(name = "sessionFactory")
private SessionFactory factory;
public void setFactory(SessionFactory factory) {
this.factory = factory;
}
public Session session() {
return factory.getCurrentSession();
}
@Override
public void create(Item item) {
session().save(item);
}
Сессии в нем не открываю, т.к. хочу заставить спринг делать это. Имеется класс Service c таким вот методом:
@Override
@Transactional
public void create(Item item) {
dao.create(item);
}
При запуске этого метода падает вот такой эксепшн:
org.hibernate.HibernateException: save is not valid without active transaction
Делал как сказано тут, ещё пару гайдов прочитал левых, но в них сессия открывается руками в каждом методе в ДАО, а мне это не нужно. Как сделать, чтоб работало? Где ошибка?