Spring / Hibernate找不到当前线程的会话(config)

时间:2014-04-23 04:11:40

标签: spring hibernate spring-mvc

我试图一起理解Spring和Hibernate的配置。每次我调用数据库时,我都会在控制台中找到当前线程错误的无会话(不会停止应用程序,因为我只是创建一个新会话,如果它找不到的话)。我有一个标准的STS Maven设置。以下是我目前设置的配置方式。但是,如果我将所有内容放在root-context.xml中并将其放在servlet-context.xml的底部,那么它的工作没有任何错误。所以我在servlet-context.xml中猜测是"覆盖"什么,而不是我的服务上的@Transactional注释。但你如何配置呢?

根context.xml中

    <!-- Configure JDBC Connection-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.apache.derby.jdbc.EmbeddedDriver" />
    <property name="url" value="jdbc:derby:C:\Users\Steven\Desktop\Programming\db-derby-10.10.1.1-bin\db-derby-10.10.1.1-bin\bin\mydb" />
</bean>

<!-- Configure Hibernate 4 Session Factory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource">
        <ref bean="dataSource" />
    </property>
    <property name="packagesToScan" value="com.css.genapp" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.DerbyTenSevenDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
        </props>
    </property>
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

servlet的context.xml中

<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />

<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<resources mapping="/resources/**" location="/resources/" />

<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <beans:property name="prefix" value="/WEB-INF/views/" />
    <beans:property name="suffix" value=".jsp" />
</beans:bean>

<beans:bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
    <beans:property name="basenames">
        <beans:list>
            <beans:value>format</beans:value>
        </beans:list>
    </beans:property>
</beans:bean>

<beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />

<context:component-scan base-package="com.css.genapp" />

3 个答案:

答案 0 :(得分:3)

您必须在servlet-context.xml和root-context.xml上定义组件扫描

  • root-context.xml:for service,repository ...
  • servlet-context.xml:用于控制器和Web关联组件。

希望它可以提供帮助。您可以查看此示例Spring, JPA and hibernate integration

的详细信息

答案 1 :(得分:0)

我认为在您的Hibernate配置中,您配置了<prop key="hibernate.current_session_context_class">thread</prop>,就像这样。

删除该属性,因为它在春天确实破坏了正确的会话/事务管理。

答案 2 :(得分:0)

您必须导入root-context.xml,因为调度程序servlet只会读取servlet-context.xml。在servlet-context.xml中添加以下行: