我试图一起理解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" />
答案 0 :(得分:3)
您必须在servlet-context.xml和root-context.xml上定义组件扫描
希望它可以提供帮助。您可以查看此示例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中添加以下行: