Hibernate - Spring Security - Spring MVC 版本

Posted

技术标签:

【中文标题】Hibernate - Spring Security - Spring MVC 版本【英文标题】:Hibernate - Spring Security - Spring MVC Versions 【发布时间】:2018-04-05 14:34:09 【问题描述】:

我正在尝试使用 Spring Security、Spring MVC 和 Hibernate 实现一个 Web 应用程序。经过对互联网的一些研究,我面临着罐子之间的一些不兼容问题。谁能帮我正确的 jar 版本?

我正在使用:

spring-webmvc、spring-aop、spring-beans、spring-context、spring-core、spring-expression、spring-web、spring-orm、spring-tx、spring-jdbc:4.3.11.RELEASE 弹簧安全配置,弹簧安全网络,弹簧安全核心:4.2.3.RELEASE hibernate-core: 4.3.8.Final 和 hibernate-jpa-2.1: 1.0.0.Final

这是我现在遇到的例外情况:

WARNING: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.filterChains': Cannot resolve reference to bean 'org.springframework.security.web.DefaultSecurityFilterChain#0' while setting bean property 'sourceList' with key [0]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.web.DefaultSecurityFilterChain#0': Cannot resolve reference to bean 'org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter#0' while setting constructor argument with key [5]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter#0': Cannot resolve reference to bean 'org.springframework.security.authentication.ProviderManager#0' while setting bean property 'authenticationManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.authentication.ProviderManager#0': Cannot resolve reference to bean 'org.springframework.security.config.authentication.AuthenticationManagerFactoryBean#0' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.config.authentication.AuthenticationManagerFactoryBean#0': FactoryBean threw exception on object creation; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.authenticationManager': Cannot resolve reference to bean 'org.springframework.security.authentication.dao.DaoAuthenticationProvider#0' while setting constructor argument with key [0]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.authentication.dao.DaoAuthenticationProvider#0': Cannot resolve reference to bean 'org.springframework.security.provisioning.JdbcUserDetailsManager#0' while setting bean property 'userDetailsService'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.security.provisioning.JdbcUserDetailsManager#0': Cannot resolve reference to bean 'dataSource' while setting bean property 'dataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in ServletContext resource [/WEB-INF/hibernate-configurations.xml]: Invalid destruction signature; nested exception is org.springframework.beans.factory.support.BeanDefinitionValidationException: Couldn't find a destroy method named 'close' on bean with name 'dataSource'

2017 年 10 月 24 日晚上 8:24:11 org.springframework.web.context.ContextLoader initWebApplicationContext 严重:上下文初始化失败 org.springframework.beans.factory.BeanCreationException:创建名为“org.springframework.security.filterChains”的bean时出错:设置bean属性“sourceList”时无法解析对bean“org.springframework.security.web.DefaultSecurityFilterChain#0”的引用带键 [0];嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为 'org.springframework.security.web.DefaultSecurityFilterChain#0' 的 bean 时出错:无法解析对 bean 'org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter# 的​​引用0' 同时使用键 [5] 设置构造函数参数;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为 'org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter#0' 的 bean 时出错:无法解析对 bean 'org.springframework.security.authentication.ProviderManager# 的​​引用0' 同时设置 bean 属性 'authenticationManager';嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为 'org.springframework.security.authentication.ProviderManager#0' 的 bean 时出错:无法解析对 bean 'org.springframework.security.config.authentication.AuthenticationManagerFactoryBean# 的引用0' 同时设置构造函数参数;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为 'org.springframework.security.config.authentication.AuthenticationManagerFactoryBean#0' 的 bean 时出错:FactoryBean 在创建对象时抛出异常;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为 'org.springframework.security.authenticationManager' 的 bean 时出错:设置时无法解析对 bean 'org.springframework.security.authentication.dao.DaoAuthenticationProvider#0' 的引用带有键 [0] 的构造函数参数;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为 'org.springframework.security.authentication.dao.DaoAuthenticationProvider#0' 的 bean 时出错:无法解析对 bean 'org.springframework.security.provisioning.JdbcUserDetailsManager# 的​​引用0' 同时设置 bean 属性 'userDetailsS​​ervice';嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名称为“org.springframework.security.provisioning.JdbcUserDetailsManager#0”的 bean 时出错:设置 bean 属性“dataSource”时无法解析对 bean“dataSource”的引用;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建 ServletContext 资源 [/WEB-INF/hibernate-configurations.xml] 中定义的名称为“dataSource”的 bean 时出错:销毁签名无效;嵌套异常是 org.springframework.beans.factory.support.BeanDefinitionValidationException:在名为“dataSource”的 bean 上找不到名为“close”的销毁方法 在 org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:359) 在 org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108) 在 org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveManagedList(BeanDefinitionValueResolver.java:382) 在 org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:157) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1531) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1276) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) 在 org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:742) 在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867) 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543) 在 org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:443) 在 org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:325) 在 org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107) 在 org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4643) 在 org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5105) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) 在 org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1425) 在 org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1415) 在 java.util.concurrent.FutureTask.run(未知来源) 在 org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) 在 java.util.concurrent.AbstractExecutorService.submit(未知来源) 在 org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:941) 在 org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:839) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) 在 org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1425) 在 org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1415) 在 java.util.concurrent.FutureTask.run(未知来源) 在 org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) 在 java.util.concurrent.AbstractExecutorService.submit(未知来源) 在 org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:941) 在 org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:258) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) 在 org.apache.catalina.core.StandardService.startInternal(StandardService.java:422) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) 在 org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:770) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) 在 org.apache.catalina.startup.Catalina.start(Catalina.java:657) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源) 在 java.lang.reflect.Method.invoke(未知来源) 在 org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:355) 在 org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:495) 原因:org.springframework.beans.factory.BeanCreationException:创建名称为'org.springframework.security.web.DefaultSecurityFilterChain#0'的bean时出错:无法解析对bean'org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter#的引用0' 同时使用键 [5] 设置构造函数参数;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为 'org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter#0' 的 bean 时出错:无法解析对 bean 'org.springframework.security.authentication.ProviderManager# 的​​引用0' 同时设置 bean 属性 'authenticationManager';嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为 'org.springframework.security.authentication.ProviderManager#0' 的 bean 时出错:无法解析对 bean 'org.springframework.security.config.authentication.AuthenticationManagerFactoryBean# 的引用0' 同时设置构造函数参数;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为 'org.springframework.security.config.authentication.AuthenticationManagerFactoryBean#0' 的 bean 时出错:FactoryBean 在创建对象时抛出异常;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为 'org.springframework.security.authenticationManager' 的 bean 时出错:设置时无法解析对 bean 'org.springframework.security.authentication.dao.DaoAuthenticationProvider#0' 的引用带有键 [0] 的构造函数参数;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为 'org.springframework.security.authentication.dao.DaoAuthenticationProvider#0' 的 bean 时出错:无法解析对 bean 'org.springframework.security.provisioning.JdbcUserDetailsManager# 的​​引用0' 同时设置 bean 属性 'userDetailsS​​ervice';嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名称为“org.springframework.security.provisioning.JdbcUserDetailsManager#0”的 bean 时出错:设置 bean 属性“dataSource”时无法解析对 bean“dataSource”的引用;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建 ServletContext 资源 [/WEB-INF/hibernate-configurations.xml] 中定义的名称为“dataSource”的 bean 时出错:销毁签名无效;嵌套异常是 org.springframework.beans.factory.support.BeanDefinitionValidationException:在名为“dataSource”的 bean 上找不到名为“close”的销毁方法 在 org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:359) 在 org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:108) 在 org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveManagedList(BeanDefinitionValueResolver.java:382) 在 org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:157) 在 org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:634) 在 org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:145) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1193) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1095) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) 在 org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 在 org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:351) ... 47 更多 还有更多,但我没有全部粘贴。

编辑 - 休眠配置 XML:

<?xml version="1.0" encoding="UTF-8"?>

http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-4.0.xsd">

<tx:annotation-driven transaction-manager="hibernateTransactionManager" />

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/xdvl" />
    <property name="username" value="root" />
    <property name="password" value="Parola1234" />     
</bean>

<!-- Hibernate 3 Annotation SessionFactory Bean definition-->

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
        </props>        
    </property>
</bean>

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.crm</groupId>
<artifactId>customer-relationship-management</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.6.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.0.0</version>
            <configuration>
                <warSourceDirectory>WebContent</warSourceDirectory>
            </configuration>
        </plugin>
    </plugins>
</build>

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>4.3.11.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>jstl</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>4.3.11.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>4.3.11.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.3.11.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.3.11.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-expression</artifactId>
        <version>4.3.11.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.2</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>4.3.11.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-security-config</artifactId>
        <version>4.2.3.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-security-web</artifactId>
        <version>4.2.3.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-security-core</artifactId>
        <version>4.2.3.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>4.3.11.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.39</version>
    </dependency>
    <dependency>
        <groupId>commons-dbcp</groupId>
        <artifactId>commons-dbcp</artifactId>
        <version>1.4</version>
    </dependency>
    <dependency>
        <groupId>commons-pool</groupId>
        <artifactId>commons-pool</artifactId>
        <version>1.5.4</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>4.3.11.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>4.3.11.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>4.3.8.Final</version>
    </dependency>
    <dependency>
        <groupId>dom4j</groupId>
        <artifactId>dom4j</artifactId>
        <version>1.6</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-commons-annotations</artifactId>
        <version>4.0.2.Final</version>
    </dependency>
    <dependency>
        <groupId>org.jboss</groupId>
        <artifactId>jboss-loggig</artifactId>
        <version>3.3.0.Final</version>
    </dependency>
    <dependency>
        <groupId>javax.transaction</groupId>
        <artifactId>jta</artifactId>
        <version>1.1</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate.javax.persistence</groupId>
        <artifactId>hibernate-jpa-2.1</artifactId>
        <version>1.0.0.Final</version>
    </dependency>
</dependencies>

【问题讨论】:

能否为数据源和休眠会话工厂提供 Spring 配置? 我刚刚编辑了帖子。 【参考方案1】:

在与@Wabi 讨论之后,我已将 hibernate-commons-annotations jar 的版本从 4.0.2.Final 更改为 4.0.5.Final 版本,现在它可以工作了 :)

谢谢你:)

【讨论】:

【参考方案2】:

org.springframework.jdbc.datasource.DriverManagerDataSource 没有close 方法。

将您的数据源 bean 定义替换为:

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

另外请注意,如javadoc 所述,该数据源不适合 Web 应用程序:

注意:这个类不是一个实际的连接池;它实际上并不池连接。它只是作为成熟连接池的简单替代品,实现了相同的标准接口,但在每次调用时都会创建新的连接。

对于 J2EE 容器之外的测试或独立环境很有用

【讨论】:

是的,你是对的,但现在我面临这个问题:警告:上下文初始化期间遇到异常 - 取消刷新尝试:org.springframework.beans.factory.BeanCreationException:创建 bean 时出错在 ServletContext 资源 [/WEB-INF/hibernate-configurations.xml] 中定义的名称“sessionFactory”:调用 init 方法失败;嵌套异常是 java.lang.NoClassDefFoundError: org/hibernate/annotations/common/reflection/ClassLoadingException 尝试在 pom.xml 中强制执行与 hibernate-core 相同的 hibernate-entitymanager 版本。此错误确实是版本不匹配,恕我直言,其中一个弹簧依赖项正在拉取与您需要的版本不同的版本。我可以在今天晚些时候详细探讨。 我知道,依赖关系不好。如果您知道或其他人确实知道我必须更改哪些依赖项,那对我来说将非常有用,因为我有很多依赖项,我可以尝试修改每个依赖项并进行很多尝试...谢谢。 而且,顺便说一句,我不使用 HibernateEntityManager。 好的,所以你包含 hibernate-commons-annotations 4.0.2 而你的 hibernate-core 版本依赖于 4.0.5。另一件事是,如果在您发布时复制,您的依赖项列表是错误的 - 几个 groupId 是错误的,它不会构建。

以上是关于Hibernate - Spring Security - Spring MVC 版本的主要内容,如果未能解决你的问题,请参考以下文章

Spring和Hibernate的注解整合 hibernate3和hibernate4/5的区别

Spring 整合Hibernate

Grails Spring Core 安全插件 - 无法解析类

maven的各种异常

为啥 Spring 在使用 Hibernate 3 时推迟关闭 Hibernate 会话

Spring + Hibernate + Spring Security 配置