spring的事务不起作用?无法和当前sessin绑定?

07-06-05 lyojbuilder
我使用 spring的声明式的事务,但是运行的时候报错:

代码
org.hibernate.HibernateException: No Hibernate Session bound to thread, and conf   
iguration does not allow creation of non-transactional one here   
        at org.springframework.orm.hibernate3.AbstractSessionFactoryBean$Transac   
tionAwareInvocationHandler.invoke(AbstractSessionFactoryBean.java:296)   
        at $Proxy1.getCurrentSession(Unknown Source)   
        at com.liferay.portlet.lyo.service.persistence.TestUtil.testquery(TestUt   
il.java:54)  
<p>

我在配置文件中明明配置了事务的!:

代码
<bean id="com.liferay.portlet.lyo.service.persistence.TestUtil" class="com.liferay.portlet.lyo.service.persistence.TestUtil" lazy-init="true">  
           
        <property name="sessionFactory">  
            <ref bean="liferaySessionFactory" />  
        </property>  
    </bean>  
<bean id="myProductService"  
      class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" lazy-init="true">  
    <property name="transactionManager" ref="liferayTransactionManager"/>  
    <property name="target">  
      <bean class="com.liferay.portlet.lyo.service.persistence.TestUtil">  
      </bean>  
    </property>  
    <property name="transactionAttributes">  
      <props>  
        <prop key="test*">PROPAGATION_REQUIRED,readOnly</prop>  
      </props>  
    </property>  
  </bean>  
<p>

我在代码中注入的sessionFactory可以得到,说明IOC式起作用的,但是代码不能使用getCurrentSession方法,如果使用就报上面的错误!我的代码:

代码
public  static List testquery(){   
        List list=new ArrayList();   
        TestUtil tu=new TestUtil();   
        Session hsession=tu.getSessionFactory().getCurrentSession();   
        list=hsession.createQuery("from UserImpl as u").list();   
        hsession.close();   
        return list;   
           
    }  


<p>

把其中的 getCurrentSession改成 openSession 就可以使用! 很明显是因为那个 allowCreate的问题,当没有事务启动的时候,getCurrentSession是无法创建Session的! 说明配置事务没有成功!但是我的配置已经和例子一摸一样了啊~ 哪位朋友能帮忙找出错误? 谢谢!

banq
2007-06-06 15:03
>getCurrentSession改成 openSession 就可以使用

getCurrentSession和openSession 是很不同的,常用的是openSession。

你必须使用Spring的HibernateSupport类来使用Hibernate,这样最方便,否则以后总是需要协调Spring和Hibernate的Session,非常麻烦。

可以说:Spring+Hibernate只有一条正确使用之道,其他方式也可以,但是非常困难麻烦,这也是框架的优点或者缺点。

猜你喜欢