通过Spring Hibernate SessionFactory

时间:2012-02-08 05:10:26

标签: java hibernate spring

我在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的值是否不是线程?

1 个答案:

答案 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>