2010-11-14 6 views
2

Попытка заставить управление транзакциями Spring работать, но это не так, как я надеялся.Spring & Hibernate: нет сеанса, связанного с потоком

я получаю исключение при запросе ничего, что требует моей базы данных:

DEBUG: org.springframework.orm.hibernate3.SessionFactoryUtils - Opening Hibernate Session 
DEBUG: org.springframework.orm.hibernate3.SessionFactoryUtils - Opening Hibernate Session 
DEBUG: org.hibernate.impl.SessionImpl - opened session at timestamp: 12897642913 
DEBUG: org.springframework.orm.hibernate3.SessionFactoryUtils - Closing Hibernate Session 
DEBUG: org.springframework.orm.hibernate3.SessionFactoryUtils - Closing Hibernate Session 
14-nov-2010 20:51:31 org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet mvc-dispatcher threw exception 
org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here 

Я уже переместил свои свойства в моем Спринг контексте, чтобы увидеть, если что пошли лучше, но нет. Моя конфигурация:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:oxm="http://www.springframework.org/schema/oxm" 
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd 
     http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
     http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-3.0.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
     http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd"> 

    <bean id="myDataSource" 
     class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
     <property name="url" value="jdbc:mysql://localhost/kidscalcula" /> 
     <property name="username" value="root" /> 
     <property name="password" value="" /> 
    </bean> 

    <bean class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" 
     id="sessionFactory"> 
     <property name="dataSource" ref="myDataSource" /> 
     <property name="mappingResources"> 
      <list> 
       <value>be/howest/kidscalcula/model/Foto.hbm.xml</value> 
       <value>be/howest/kidscalcula/model/Kindleerplanonderdeel.hbm.xml 
       </value> 
       <value>be/howest/kidscalcula/model/Klas.hbm.xml</value> 
       <value>be/howest/kidscalcula/model/Leerkracht.hbm.xml</value> 
       <value>be/howest/kidscalcula/model/Leerling.hbm.xml</value> 
       <value>be/howest/kidscalcula/model/Leerplan.hbm.xml</value> 
       <value>be/howest/kidscalcula/model/LeerplanOefenreeks.hbm.xml 
       </value> 
       <value>be/howest/kidscalcula/model/Leerplanonderdeel.hbm.xml</value> 
       <value>be/howest/kidscalcula/model/Niveau.hbm.xml</value> 
       <value>be/howest/kidscalcula/model/Oefenreeks.hbm.xml</value> 
       <value>be/howest/kidscalcula/model/Overgangsregel.hbm.xml</value> 
       <value>be/howest/kidscalcula/model/Rapport.hbm.xml</value> 
       <value>be/howest/kidscalcula/model/RapportLeerplanonderdeel.hbm.xml 
       </value> 
       <value>be/howest/kidscalcula/model/Schooljaar.hbm.xml</value> 
       <value>be/howest/kidscalcula/model/Subonderdeel.hbm.xml</value> 
      </list> 
     </property> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
       <prop key="hibernate.hbm2ddl.auto">update</prop> 
       <prop key="hibernate.connection.pool_size">3</prop> 
       <prop key="hibernate.show_sql">true</prop> 
       <prop key="hibernate.format_sql">true</prop> 
       <prop key="hibernate.use_sql_comments">true</prop> 
       <prop key="hibernate.cache.use_second_level_cache">false</prop> 
      </props> 
     </property> 
    </bean> 


    <!-- Transaction manager for a single Hibernate SessionFactory (alternative 
     to JTA) --> 
    <bean id="transactionManager" 
     class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
     <property name="sessionFactory"> 
      <ref bean="sessionFactory" /> 
     </property> 
    </bean> 

    <tx:annotation-driven /> 
</beans> 

Я просто впрыскивать мои org.hibernate.SessionFactory в моей DAO и использовать @Transactional аннотаций на моих методах или на моем классе.

@Repository 
public class LeerlingDAOimpl implements LeerlingDAO { 
    @Autowired 
    public LeerlingDAOimpl(SessionFactory sessionFactory) { 
     this.sessionFactory = sessionFactory; 
    } 

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

+0

Получить StackTrace исключения. Появляется ли в нем TransactionInterceptor? – meriton

+3

Я нашел проблему. Моя проверка аннотации произошла в другом xml, а затем в моем . Он никогда не узнавал, что ему нужно было начать транзакцию, поэтому никогда не было обнаружено сеанса. – toomuchcs

ответ

7

Поскольку конфигурация выглядит хорошо, есть несколько возможных причин:

  • Вы называете @Transactional метод объекта, созданного с new (т.е. не получается с весны)

  • Вы называете @Transactional метод из другого метода того же объекта (в этом случае транзакционный аспект не применяется, поскольку он основан на прокси)

  • Ваш объект @Transactional методов объявлен в контексте, где <tx:annotation-driven> не действует (например, ваш @Transactional объект объявлен в ...-servlet.xml, в то время как <tx:annotation-driven> только объявлен в applicationContext.xml)

+0

вызывается из контроллера Spring MVC, где вводится услуга. Ни одна из двух первых возможностей не применяется. Что касается третьего: это может быть так! Я проверю это. однако, я не разделял конфигурации, как рекомендует весна; только один root-context.xml, который импортирует 3 других xml, диспетчера сервлетов, hibernateconfiguration и еще один для JSON. – toomuchcs

+0

большое спасибо. Я ломаю голову над этим вопросом около двух дней. Никогда не думал, что это так просто! Но я рад, я узнал еще о весне, что я никогда не забуду;) – toomuchcs

Смежные вопросы