我在Spring 3中使用Hibernate3。我正在尝试使用Spring启动hibernate事务。 以下是我的配置
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml" />
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
运行应用程序时出现以下错误。
HibernateException: get is not valid without active transaction
at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:341)
我在hibernate config xml
中有以下行<property name="hibernate.current_session_context_class">thread</property>
使用hibernate事务的代码是:
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.getCurrentSession();
Book book = (Book)session.get(Book.class, id);
这可能有什么问题? current_session_context_class的值是否不是线程?
答案 0 :(得分:2)
问题在于
SessionFactory sessionFactory = new Configuration()。configure()。buildSessionFactory();
看来,当您使用Spring事务管理时,需要使用您在applicationContext.xml中配置的sessionFactory(使用依赖注入)。
以下一段代码解决了这个问题。
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory)
{
this.sessionFactory = sessionFactory;
}
在applicationContext.xml中:
<bean id="BookService" class="hibernate.BookServiceImpl">
<property name="sessionFactory" ref="sessionFactory" />
</bean>