@Transactional 不打开 Hibernate 事务
@Transactional doesn't open Hibernate Transaction
我在 beans.xml:
中声明了 Spring 个 Beans
<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>
dataSource 和 sessionFactory bean:
@Bean(name = "dataSource")
public DriverManagerDataSource dataSource() {
DriverManagerDataSource ds = new DriverManagerDataSource();
ds.setUsername(userName);
ds.setPassword(password);
ds.setDriverClassName(driverName);
ds.setUrl(url);
return ds;
}
@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;
}
如果我分别使用 sessionFactory 和 dataSource bean,它们运行良好。 A 还有 DAO class:
@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);
}
我不打开会话,因为我想强制 Spring 这样做。我有服务 class,方法是:
@Override
@Transactional
public void create(Item item) {
dao.create(item);
}
调用时出现异常:
org.hibernate.HibernateException: save is not valid without active transaction
我已经按照 this tutorial 所说的去做了。我的错误在哪里?
我之前遇到过这个问题是因为 Spring 是使用 CGLib 还是 Javassist 来增强您的 class 以提供事务性。如果我没记错的话,如果你只有 Javassist,那么 Spring 需要在其上创建代理以实现事务注释的 class 必须实现一个接口。
尝试从您的 sessionFactory 配置中删除 props.put("hibernate.current_session_context_class", "thread")
。当您使用 Spring 托管事务时,您不需要它。让我知道这是否有效。
我在 beans.xml:
中声明了 Spring 个 Beans<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>
dataSource 和 sessionFactory bean:
@Bean(name = "dataSource")
public DriverManagerDataSource dataSource() {
DriverManagerDataSource ds = new DriverManagerDataSource();
ds.setUsername(userName);
ds.setPassword(password);
ds.setDriverClassName(driverName);
ds.setUrl(url);
return ds;
}
@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;
}
如果我分别使用 sessionFactory 和 dataSource bean,它们运行良好。 A 还有 DAO class:
@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);
}
我不打开会话,因为我想强制 Spring 这样做。我有服务 class,方法是:
@Override
@Transactional
public void create(Item item) {
dao.create(item);
}
调用时出现异常:
org.hibernate.HibernateException: save is not valid without active transaction
我已经按照 this tutorial 所说的去做了。我的错误在哪里?
我之前遇到过这个问题是因为 Spring 是使用 CGLib 还是 Javassist 来增强您的 class 以提供事务性。如果我没记错的话,如果你只有 Javassist,那么 Spring 需要在其上创建代理以实现事务注释的 class 必须实现一个接口。
尝试从您的 sessionFactory 配置中删除 props.put("hibernate.current_session_context_class", "thread")
。当您使用 Spring 托管事务时,您不需要它。让我知道这是否有效。