简体   繁体   English

org.hibernate.HibernateException:找不到会话

[英]org.hibernate.HibernateException: No Session found

Hi I am facing a very strange problem. 嗨,我面临一个非常奇怪的问题。 I am using Spring MVC 3.0+Spring Security 3.2+hibernate 4.3. 我使用的是Spring MVC 3.0 + Spring Security 3.2 + hibernate 4.3。 before login I am able to hit database and getting entity befor login. 在登录之前我能够点击数据库并获取实体登录。 But after login by spring security, I am getting exception org.hibernate.HibernateException: No Session found for current thread . 但是在Spring安全登录后,我得到异常org.hibernate.HibernateException: No Session found for current thread This exception thrown on sessionFactory.getCurrentSession() sessionFactory.getCurrentSession()抛出此异常

I have used transection management by AOP. 我使用了AOP的横断管理。 My question is: 我的问题是:

Why excpetion come after login? 登录后为什么会出现这种情况? While it is working fine before login? 虽然它在登录前工作正常吗?

My Code is as below: 我的代码如下:

@Repository("categoryDAO")
public class CategoryDAOHibernateImpl implements CategoryDAO {

@Autowired
SessionFactory sessionFactory;

public List<Category> findAll() {
    List<Category> list;
    try {
        Session session = sessionFactory.getCurrentSession();
        Criteria criteria = session.createCriteria(Category.class);
        list = criteria.list();
    } catch (Exception e) {
        throw new BookStoreDAORuntimeException(e.getMessage(), e);
    }
    return list;
}
}

FullStacktrace: FullStacktrace:

  StandardWrapperValve[appServlet]: Servlet.service() for servlet appServlet threw exception
 org.hibernate.HibernateException: No Session found for current thread
at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:106)
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1012)
at com.abhendra.bookstore.common.entities.dao.hibernate.UserDAOHibernateImpl.findByEmail(UserDAOHibernateImpl.java:68)
at com.abhendra.bookstore.management.user.impl.UserManagementServiceImpl.findByEmail(UserManagementServiceImpl.java:20)
at com.abhendra.bookstore.LibreryController.showCategory(LibreryController.java:27)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:214)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:748)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:931)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:822)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:807)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:344)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:154)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:199)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:108)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:316)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:357)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:260)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:188)
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544)
at java.lang.Thread.run(Thread.java:744)
]]

daoContext.xml daoContext.xml

<bean id="dataSource"
    class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName">
        <value>org.postgresql.Driver</value>
    </property>
    <property name="url">
        <value>jdbc:postgresql://localhost:5432/bookstore</value>
    </property>
    <property name="username">
        <value>bookstore</value>
    </property>
    <property name="password">
        <value>bookstore</value>
    </property>
</bean>

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource">
        <ref bean="dataSource" />
    </property>
    <property name="mappingResources">
        <list>
            <value>Author.hbm.xml</value>
            <value>Book.hbm.xml</value>
            <value>Category.hbm.xml</value>
            <value>Comment.hbm.xml</value>
            <value>Download.hbm.xml</value>
            <value>Rating.hbm.xml</value>
            <value>Role.hbm.xml</value>
            <value>User.hbm.xml</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <value>
            hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
            jdbc.use_getGeneratedKeys=true
            hibernate.show_sql=true
            hibernate.hbm2ddl.auto=update
            hibernate.generate_statistics=false

            hibernate.cache.use_second_level_cache=false
            hibernate.cache.use_query_cache=false
            hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext
        </value>
    </property>

</bean>

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory">
        <ref bean="sessionFactory" />
    </property>
</bean>

<tx:advice id="defaultTxAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="get*" read-only="true" propagation="REQUIRED"/>
        <tx:method name="find*" read-only="true" propagation="REQUIRED"/>
        <tx:method name="*" />
    </tx:attributes>
</tx:advice>



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

<aop:config>
    <aop:pointcut id="dbServiceOperations"
        expression="execution(* com.abhendra.bookstore.common.entities.dao.*DAO*.*(..))" />
    <aop:advisor pointcut-ref="dbServiceOperations" advice-ref="defaultTxAdvice" />
</aop:config>

SecurityConfig: SecurityConfig:

<security:http auto-config="false" use-expressions="true">
    <security:form-login login-page="/bookstore/authentication/login"
        login-processing-url="/bookstore/authentication/loginProcess"
        default-target-url="/bookstore/home/index"
        authentication-failure-url="/bookstore/authentication/login?login_error=1" />
    <!-- authentication-failure-handler-ref="postFailedAuthHandler" -->
    <security:logout logout-url="/bookstore/authentication/logout"
        logout-success-url="/bookstore/authentication/login" />
    <security:intercept-url pattern="/bookstore/admin/**" access="isAuthenticated()" />
    <security:intercept-url pattern="/bookstore/home/**" access="isAuthenticated()" />
</security:http>

<bean id="authenticationProvider" class="com.abhendra.core.spring.security.BookstoreAuthenticationProvider" />

<security:authentication-manager alias="authenticationManager" erase-credentials="false">
    <security:authentication-provider ref="authenticationProvider"></security:authentication-provider>
</security:authentication-manager>

rootContext.xml rootContext.xml

<import resource="classpath:daoContext.xml" />

<context:component-scan base-package="com.abhendra.bookstore, com.abhendra.core" />

web.xml web.xml中

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring/root-context.xml, /WEB-INF/spring/appServlet/security-config.xml</param-value>
</context-param>

<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- Processes application requests -->
<servlet>
    <servlet-name>appServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>
        org.springframework.web.filter.DelegatingFilterProxy
    </filter-class>
</filter>   

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/bookstore/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>    
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>

<!-- Map all /resources requests to the Resource Servlet for handling -->
<!-- <servlet-mapping>
    <servlet-name>Resources Servlet</servlet-name>
    <url-pattern>/resources/*</url-pattern>
</servlet-mapping> -->

<servlet-mapping>
    <servlet-name>appServlet</servlet-name>
    <url-pattern>/bookstore/*</url-pattern>
</servlet-mapping>

Thanks In Advance.:-) 提前致谢。:-)

The code is trying to get the current session, but there is no configuration for @Transactional that would allow for the container to add a session to the thread before calling an annotated method. 代码试图获取当前会话,但是@Transactional没有配置允许容器在调用带注释的方法之前向线程添加会话。

In the stacktrace we can see that LibreryController calls UserManagementServiceImpl, that calls UserDAOHibernateImpl, and there are no transactional proxies in the middle. 在堆栈跟踪中,我们可以看到LibreryController调用UserManagementServiceImpl,它调用UserDAOHibernateImpl,并且中间没有事务代理。

You should add support for @Transactional, annotate UserManagementServiceImpl with it and that should solve the problem. 您应该添加对@Transactional的支持,用它注释UserManagementServiceImpl,这应该可以解决问题。 See this blog post for how to do this. 有关如何执行此操作,请参阅此博客文章

try this will may help: 试试这可能会有所帮助:

    try {
        Session session = sessionFactory.getCurrentSession();
        session.getTransaction().begin();
        Criteria criteria = session.createCriteria(Category.class);
        list = criteria.list();
        session.getTransaction().commit();
    } catch (Exception e) {
        throw new BookStoreDAORuntimeException(e.getMessage(), e);
    }

Try adding @Transactional to your class. 尝试将@Transactional添加到您的班级。 Modify your sessioFactory like this and add a setter: 像这样修改你的sessioFactory并添加一个setter:

@Autowired
@Qualifier("sessionFactory")
private SessionFactory sessionFactory;

public void setSessionFactory(SessionFactory sessionFactory) {
    this.sessionFactory = sessionFactory;
}

This is how it works for me. 这就是它对我有用的方式。 If that doesn't help, try opening the session yourself: 如果这没有帮助,请尝试自己打开会话:

private Session session = null;
private Transaction tx = null;

public List<Category> findAll() {
    session = sessionFactory.openSession();
    tx = session.beginTransaction();
}

Finally I solved my problem without adding extra annotation(like @Transactional). 最后,我解决了我的问题,没有添加额外的注释(如@Transactional)。 I added this in web.xml: 我在web.xml中添加了这个:

<filter>
    <filter-name>hibernateFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
    <init-param>
        <param-name>sessionFactoryBeanName</param-name>
        <param-value>sessionFactory</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>hibernateFilter</filter-name>
    <url-pattern>/bookstore/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>

But I don't know why it solved and how. 但我不知道为什么它解决了,如何解决。 Can any one drop some light on it? 任何一个人都可以放一些光吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Hibernate 4:org.hibernate.HibernateException:当前会话找不到会话 - Hibernate 4 : org.hibernate.HibernateException: No Session found for current thread org.hibernate.HibernateException:使用tx:advise找不到当前线程的会话 - org.hibernate.HibernateException: No Session found for current thread with tx:advise org.hibernate.HibernateException: 没有找到当前线程 5 的会话 - org.hibernate.HibernateException: No Session found for current thread 5 Spring + Hibernate应用程序中的问题:org.hibernate.HibernateException:找不到当前线程的Session - Problems in Spring + Hibernate application: org.hibernate.HibernateException: No Session found for current thread 请求处理失败; 嵌套的异常是org.hibernate.HibernateException:当前会话找不到会话 - Request processing failed; nested exception is org.hibernate.HibernateException: No Session found for current thread Estado HTTP 500-请求处理失败; 嵌套的异常是org.hibernate.HibernateException:当前会话找不到会话 - Estado HTTP 500 - Request processing failed; nested exception is org.hibernate.HibernateException: No Session found for current thread Spring Security authenticationFailure:错误org.hibernate.HibernateException:没有找到当前线程的会话 - Spring Security authenticationFailure : error org.hibernate.HibernateException: No Session found for current thread org.hibernate.HibernateException:没有Hibernate会话绑定到线程 - org.hibernate.HibernateException:No Hibernate Session bound to thread 嵌套的异常是org.hibernate.HibernateException:当前会话addDepartment控制器找不到会话 - nested exception is org.hibernate.HibernateException: No Session found for current thread addDepartment controller 由于&#39;org.hibernate.HibernateException所需的@Transactional注释:找不到当前线程的异常&#39;异常 - @Transactional annotation required due to 'org.hibernate.HibernateException: No Session found for current thread' exception
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM