2009-10-22 5 views
0

Я использую Struts + Hibernate + Spring для разработки моего проекта. И вот мой XML-файл Spring Context. Когда я вызывал «sessionFactory.getCurrentSession()» в начале метода userDao.getXXXX, исключение, подробное сообщение которого «No Hibernate Session, связанное с потоком», а конфигурация не позволяет создать не транзакционный код здесь ».Нет сеанса Hibernate, связанного с потоком

<!-- Hibernate Configuration --> 
<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 

    <property name="configLocation"> 
     <value>classpath:hibernate.cfg.xml</value> 
    </property> 

</bean> 

<!-- Spring Transaction Manager --> 
<bean id="transactionManager" 
    class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory"> 
     <ref bean="sessionFactory"/>  
    </property> 
</bean> 

<!-- Spring Transaction Descriptions --> 
<bean id="transactionAttributeSource" 
    class="org.springframework.transaction.interceptor.MethodMapTransactionAttributeSource"> 
    <property name="methodMap"> 
     <map> 
      <entry key="com.miaozhen.monitor.service.LoginServiceImpl.*"> 
       <value>PROPAGATION_REQUIRED</value> 
      </entry> 
     </map> 
    </property> 
</bean> 

<bean id="transactionInterceptor" 
    class="org.springframework.transaction.interceptor.TransactionInterceptor"> 
    <property name="transactionManager"> 
     <ref bean="transactionManager"/> 
    </property> 
    <property name="transactionAttributeSource"> 
     <ref bean="transactionAttributeSource"/>  
    </property> 
</bean> 

<bean id="transactionAdvisor" 
    class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor"> 
    <constructor-arg> 
     <ref bean="transactionInterceptor"/> 
    </constructor-arg> 
</bean> 

<bean id="autoproxy" 
    class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator">  
</bean> 

<!-- DAO --> 
<bean id="userDao" 
    class="com.miaozhen.dbservice.hibernate.dao.AUserDAO"> 
    <property name="sessionFactory"> 
     <ref local="sessionFactory"/> 
    </property> 
</bean> 

<!-- Service Layer --> 

<bean id="loginService" 
    class="com.miaozhen.monitor.service.LoginServiceImpl"> 
    <property name="userDao"> 
     <ref bean="userDao"/> 
    </property> 
</bean> 

<!-- Struts Actions for DelegatingActionProxy --> 
<bean name="/login" 
    class="com.miaozhen.monitor.struts.action.LoginAction"> 
    <property name="loginService"> 
     <ref bean="loginService"/> 
    </property> 
</bean> 

ответ

0

Это довольно сложная конфигурация, но я подозреваю, что loginService боба какой-то образом не проксированный с transactionAdvisor, несмотря на то, что я могу видеть, что то, что вы пытаетесь сделать.

Попробуйте убедиться, что loginService, который вводится в контроллер, фактически является сгенерированным прокси-объектом, а не необработанным объектом LoginServiceImpl. Отладчик также будет очень полезен, чтобы убедиться, что выполнение кода проходит через TransactionInterceptor.

Есть ли причина, по которой вы так поступаете? Есть гораздо более простые способы достижения того же, что не связано с созданием советников, автопрокси-заводов, источников атрибутов транзакций и т. Д. Например, использование <tx:annotation-driven> и @Transactional делает этот материал простым. Может быть, это потому, что ваш нынешний подход означает, что у вас не должно быть ссылок на Spring в вашем коде, что вам понравилось?

+0

Спасибо за отличный ответ. Я уверен, что loginService является объектом некоторого прокси-класса. – lululau