【问题标题】:How to configure sessionFactory and EntityManager in SpringBoot Application如何在 Spring Boot Application 中配置 sessionFactory 和 EntityManager
【发布时间】:2017-04-11 13:41:07
【问题描述】:

我在 application.yml 中配置了数据源,并在我的 pom.xml 中添加了 spring-boot-starter-data-jpa。启动服务器时出现以下错误。

“原因:java.lang.IllegalStateException:EntityManagerFactory 不能为空”

完整堆栈跟踪:

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [XXX.XXX.XXXDao]: Factory method 'XXXDao' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalStateException: EntityManagerFactory must not be null
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189)
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588)
    ... 36 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalStateException: EntityManagerFactory must not be null
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:175)
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:127)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1585)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:254)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:220)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:351)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:332)
    at org.springframework.orm.jpa.EntityManagerFactoryUtils.findEntityManagerFactory(EntityManagerFactoryUtils.java:143)
    at org.springframework.orm.jpa.EntityManagerFactoryAccessor.setBeanFactory(EntityManagerFactoryAccessor.java:137)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeAwareMethods(AbstractAutowireCapableBeanFactory.java:1597)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1565)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:331)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162)
    ... 37 more
Caused by: java.lang.IllegalStateException: EntityManagerFactory must not be null
    at org.springframework.util.Assert.state(Assert.java:392)
    at org.springframework.orm.jpa.vendor.HibernateJpaSessionFactoryBean.getObject(HibernateJpaSessionFactoryBean.java:46)
    at org.springframework.orm.jpa.vendor.HibernateJpaSessionFactoryBean.getObject(HibernateJpaSessionFactoryBean.java:41)
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:168)
    ... 66 more

我的 pom.xml,

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

    <parent>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-parent</artifactId>
       <version>1.3.2.RELEASE</version>
   </parent>

 <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</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</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
    </dependency>

    <!-- helps in serialization -->
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jdk8</artifactId>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jsr310</artifactId>
    </dependency>

我的应用程序.yml

spring:
  profiles: default
  jmx.enabled: false

---

spring:
  datasource:
    url: jdbc:mysql://localhost/databaseName
    username: root
    password: password
    driver-class-name: com.mysql.jdbc.Driver
    testOnBorrow: true
    validationQuery: SELECT 1
  jpa:
    hibernate:
      ddl-auto: validate
    properties:
      hibernate:
        current_session_context_class: org.springframework.orm.hibernate4.SpringSessionContext
example:
  scheduledJob: 
    enabled: true
  pushing:
    data:
      dir: /tmp/

【问题讨论】:

标签: java spring-boot sessionfactory hibernate-5.x hibernate-entitymanager


【解决方案1】:

你应该在 pom.xml 中添加 mysql 依赖,因为你的数据源驱动程序是 mysql

<dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
    </dependency>

Here example Spring boot with mysql。而spring boot的功能之一是AutoConfiguration。

【讨论】:

    【解决方案2】:

    检查您是否有@SpringBootApplication 或@EnableAutoConfiguration(由@SpringBootApplication 添加)。

    这将启用自动配置,它将根据您的类路径的内容自动为您实例化必要的 bean。 因此,还要检查类路径以查看您是否添加了所有必要的依赖项。 SpringBoot 通过提供包含多个依赖项的启动器来帮助您添加这些依赖项。 在你的情况下这个 - spring-boot-starter-data-jpa - 你已经添加了

    有空starters

    如果这仍然不起作用,那么配置中缺少某些东西 (application.yml)

    您可以尝试设置以下键之一:

    spring.jpa.database= # Target database to operate on, auto-detected by default. Can be alternatively set using the "databasePlatform" property.
    spring.jpa.database-platform= # Name of the target database to operate on, auto-detected by default. Can be alternatively set using the "Database" enum.
    

    有一个常用设置的参考here。

    注意:您可以随时定义自己的 bean,这些 bean 将覆盖自动配置添加的那些。

    【讨论】:

      猜你喜欢
      • 2016-01-09
      • 2017-02-10
      • 2019-07-20
      • 2017-10-09
      • 1970-01-01
      • 2020-03-16
      • 2018-12-27
      • 2015-12-31
      • 2013-01-26
      相关资源
      最近更新 更多