【问题标题】:No CurrentSessionContext configured未配置 CurrentSessionContext
【发布时间】:2014-12-27 08:59:09
【问题描述】:

抱歉英语不好。我的项目从spring-boot 1.1.8开始,遇到异常No CurrentSessionContext configured,然后我做了一些搜索,添加属性<property name="hibernate.current_session_context_class">org.hibernate.context.ThreadLocalSessionContext</property>可以解决这个问题,但是

如何使用 java 类来配置这个属性?

更新:我改成Hibernate4.x方式来定义SessionFactory但还是报同样的错误,请帮忙!

使用java 1.8speing boot 1.1.8

这是我的 pom.xml

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
        <main.basedir>${basedir}/../..</main.basedir>
        <m2eclipse.wtp.contextRoot>../</m2eclipse.wtp.contextRoot>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>1.1.8.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>

这是我的服务和控制器

@AutoWried
SessionFactory sessionFactory;

@Service
@Transactional
public class UserServiceImpl implements UserService {
    public boolean isEmailExist(String email) {
        Session session = sessionFactory.openSession();
        // if I use getCurrentSession(), I will got the No Session found for current thread
        //Session session = sessionFactory.getCurrentSession();
        Criteria c = UserCriteria.isEmailExisting(session, email);
        List<UserInfo> usrs = c.list();
        session.close();
        if (0 == usrs.size() || usrs.isEmpty())
            return false;
        return true;
    }
}

@Controller
public class UserRegisterController {
    @Autowired
    UserService userService;

    @RequestMapping("/doRegist")
    public void doRegister(HttpServletRequest request,
            HttpServletResponse response) {
        String usrEmail = request.getParameter("email");
        boolean exist = userService.isEmailExist(session, usrEmail);
        //todo
    }
}

WebApplicatoinStarter.java

@Configuration
@EnableAutoConfiguration
@ComponentScan("com.mytest")
public class WebApplicationStarter extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(
            SpringApplicationBuilder application) {
        return application.sources(WebApplicationStarter.class);
    }

    public static void main(String[] args) throws Exception {
        ApplicationContext context = SpringApplication.run(WebApplicationStarter.class, args);
    }

    @Bean
    public SessionFactory sessionFactory(HibernateEntityManagerFactory hemf) {
        return hemf.getSessionFactory();
    }
}

更新:这是我的完整堆栈跟踪:

2014-11-01 08:41:11.736  INFO 3312 --- [           main] com.hotsoft.WebApplicationStarter        : Starting WebApplicationStarter on zblqmc with PID 3312 (D:\x51\p2\target\classes started by lzzafll in D:\x51\p2)
2014-11-01 08:41:11.814  INFO 3312 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@442675e1: startup date [Sat Nov 01 08:41:11 CST 2014]; root of context hierarchy
2014-11-01 08:41:13.047  INFO 3312 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Overriding bean definition for bean 'beanNameViewResolver': replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter.class]]
2014-11-01 08:41:14.009  INFO 3312 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [class org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$dd4f2c7a] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2014-11-01 08:41:14.041  INFO 3312 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'transactionAttributeSource' of type [class org.springframework.transaction.annotation.AnnotationTransactionAttributeSource] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2014-11-01 08:41:14.056  INFO 3312 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'transactionInterceptor' of type [class org.springframework.transaction.interceptor.TransactionInterceptor] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2014-11-01 08:41:14.072  INFO 3312 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.config.internalTransactionAdvisor' of type [class org.springframework.transaction.interceptor.BeanFactoryTransactionAttributeSourceAdvisor] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2014-11-01 08:41:14.647  INFO 3312 --- [           main] .t.TomcatEmbeddedServletContainerFactory : Server initialized with port: 8080
2014-11-01 08:41:14.928  INFO 3312 --- [           main] o.apache.catalina.core.StandardService   : Starting service Tomcat
2014-11-01 08:41:14.928  INFO 3312 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/7.0.55
2014-11-01 08:41:15.755  INFO 3312 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2014-11-01 08:41:15.771  INFO 3312 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 3957 ms
2014-11-01 08:41:16.427  INFO 3312 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean        : Mapping servlet: 'dispatcherServlet' to [/]
2014-11-01 08:41:16.427  INFO 3312 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2014-11-01 08:41:17.534  INFO 3312 --- [           main] j.LocalContainerEntityManagerFactoryBean : Building JPA container EntityManagerFactory for persistence unit 'default'
2014-11-01 08:41:17.550  INFO 3312 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [
name: default
...]
2014-11-01 08:41:17.660  INFO 3312 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate Core {4.3.6.Final}
2014-11-01 08:41:17.660  INFO 3312 --- [           main] org.hibernate.cfg.Environment            : HHH000206: hibernate.properties not found
2014-11-01 08:41:17.660  INFO 3312 --- [           main] org.hibernate.cfg.Environment            : HHH000021: Bytecode provider name : javassist
2014-11-01 08:41:17.910  INFO 3312 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {4.0.5.Final}
2014-11-01 08:41:18.050  INFO 3312 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
2014-11-01 08:41:18.206  INFO 3312 --- [           main] o.h.h.i.ast.ASTQueryTranslatorFactory    : HHH000397: Using ASTQueryTranslatorFactory
2014-11-01 08:41:18.861  INFO 3312 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2014-11-01 08:41:19.047  INFO 3312 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/hello],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String com.hotsoft.web.UserRegisterController.hello(java.util.Map<java.lang.String, java.lang.Object>)
2014-11-01 08:41:19.047  INFO 3312 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/doRegist],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public void com.hotsoft.web.UserRegisterController.doRegister(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
2014-11-01 08:41:19.063  INFO 3312 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2014-11-01 08:41:19.063  INFO 3312 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],methods=[],params=[],headers=[],consumes=[],produces=[text/html],custom=[]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest)
2014-11-01 08:41:19.078  INFO 3312 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2014-11-01 08:41:19.078  INFO 3312 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2014-11-01 08:41:19.413  INFO 3312 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2014-11-01 08:41:19.554  INFO 3312 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080/http
2014-11-01 08:41:19.569  INFO 3312 --- [           main] com.hotsoft.WebApplicationStarter        : Started WebApplicationStarter in 8.551 seconds (JVM running for 9.276)
2014-11-01 08:41:32.754  INFO 3312 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring FrameworkServlet 'dispatcherServlet'
2014-11-01 08:41:32.754  INFO 3312 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization started
2014-11-01 08:41:32.786  INFO 3312 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed in 32 ms
2014-11-01 08:41:39.988 ERROR 3312 --- [nio-8080-exec-6] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.hibernate.HibernateException: No CurrentSessionContext configured!] with root cause

org.hibernate.HibernateException: No CurrentSessionContext configured!
    at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1012)
    at com.hotsoft.web.UserRegisterController.doRegister(UserRegisterController.java:41)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
    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:749)
    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:938)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1736)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1695)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)

【问题讨论】:

  • 不,这并不能解决问题,只会让问题变得更糟。如果您需要SessionFactory(不知道为什么,但唉)使用HibernateJpaSessionFactoryBean 在您的上下文中获取一个,然后只需注入它而不是打开自己。发布您的配置/应用程序类。我也希望你的UserServiceImpl@Service@Transactional 注释,因为现在没有交易。
  • @M.Deinum 谢谢先生,谢谢您的期待!是的,我确实打算使用SessionFactory,因为我决定使用休眠标准。
  • JPA 也有条件(从 JPA2 开始),您应该小心使用这些条件,对于简单查询,只需使用查询即可。
  • @M.Deinum 先生我更新了我的问题,你能帮帮我吗?
  • 不要构建自己的数据源。 Spring Boot 就是这样做的。只需将属性添加到您的application.properties。也不要使用 util 类使用 Spring。您正在努力不使用 Spring、Spring Boot 等。您正在尽一切努力解决它。

标签: java spring-boot sessionfactory


【解决方案1】:

你对h​​ibernate的配置和使用是错误的。您正在使用 Spring 甚至更好的 Spring Boot,但是您发布的内容非常努力地不使用这些框架并尝试解决它们。我强烈建议使用 Spring Boot 并让它为您配置。

先删除你的HibernateUtils,把它埋得很深,再也不看它了。您还可以删除您的 AppConfig,因为 Spring Boot 可以并且会处理 DataSource

接下来在您的src/main/resources 目录中创建一个名为application.properties 的文件,并将以下内容放入其中。

spring.datasource.url=jdbc:mysql://localhost/mysql
spring.datasource.username=root
spring.datasource.password=

这将自动为您配置一个DataSource。您不需要驱动程序,因为它是从您提供的 url 推导出来的。接下来添加以下属性来配置 JPA。

spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext

有关更多设置和属性,我建议阅读Spring Boot Reference Guide 的属性,请查看comprehensive list

接下来在您的WebApplicationStarter 中添加HibernateJpaSessionFactoryBean 以将创建的JPA EntityManagerFactory 公开为SessionFactory

@Configuration
@EnableAutoConfiguration
@ComponentScan("com.mytest")
public class WebApplicationStarter extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(WebApplicationStarter.class);
    }

    public static void main(String[] args) throws Exception {
        ApplicationContext context = SpringApplication.run(WebApplicationStarter.class, args);
    }

    @Bean
    public SessionFactory sessionFactory(HibernateEntityManagerFactory hemf) {
        return hemf.getSessionFactory();
    }
}

然后只需将@AutowireSessionFactory 放入您的UserServiceImpl

@Service
@Transactional
public class UserServiceImpl implements UserService {

    @Autowired
    private SessionFactory sessionFactory;

}

现在您可以使用SessionFactory

【讨论】:

  • 嗯,有趣的是,由于某种原因,正在创建一个未实现所需接口的代理。你有更多的自定义配置而不是依赖 Spring Boot 吗?啊,恐怕你在这里遇到了一个小问题......虽然 Spring 通常已经更新为与 hibernate 4.3 及更低版本一起使用,但我猜这个类是一个疏忽。我更新了应该可行的解决方案的答案。
  • 绝对没有更多的自定义配置。我很沮丧,一旦我使用@Bean HibernateJpaSessionFactoryBean 这个错误出来了,我想把我的头发刮掉!我想配置另一个数据源,一个是读取,另一个是写入,但还没有开始。
  • 我为此创建了一个issue。同时修改答案应该可以。
  • 谢谢先生,您一定是个好父亲!我应该使用较旧的春季版本重新启动我的项目吗?
  • 不,正如我所说的我的答案中的代码(我修改它)应该可以工作,它不再使用HibernateJpaSessionFactoryBean。该问题将在 Spring 的下一个修复程序(4.1.2 和 4.0.8)中得到解决。
【解决方案2】:

我收到此错误是因为我有

sessionFactory.getCurrentSession();

当我把它改成

sessionFactory.openSession();

效果很好。

【讨论】:

  • 是的,这对我也有用,你能给我一些解释吗?
  • @AkhileshMagdum 我希望我能!春天一如既往的混乱
猜你喜欢
  • 2013-12-14
  • 1970-01-01
  • 1970-01-01
  • 2022-08-05
  • 2013-12-08
  • 2016-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多