Spring & Hibernate: сессия не связана с потоком - PullRequest
2 голосов
/ 14 ноября 2010

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

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

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

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

<?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;
    }

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

1 Ответ

7 голосов
/ 14 ноября 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...