Hibernate 原因:java.lang.IllegalStateException:EntityManagerFactory不能为null

Hibernate 原因:java.lang.IllegalStateException:EntityManagerFactory不能为null,hibernate,jpa,spring-boot,hibernate-entitymanager,spring-config,Hibernate,Jpa,Spring Boot,Hibernate Entitymanager,Spring Config,我以前使用的是Spring Boot1.4.2.RELEASE和Hibernate5.0.11.Final,这是我的数据库配置类: @Configuration @EnableTransactionManagement public class DataBaseConfiguration { @Bean(name = "sessionFactory") public HibernateJpaSessionFactoryBean sessionFactory() {

我以前使用的是Spring Boot1.4.2.RELEASE和Hibernate5.0.11.Final,这是我的数据库配置类:

@Configuration
@EnableTransactionManagement
public class DataBaseConfiguration {

    @Bean(name = "sessionFactory")
    public HibernateJpaSessionFactoryBean sessionFactory() {
        return new HibernateJpaSessionFactoryBean();
    }

    @Bean
    public HibernateTransactionManager transactionManager() {
        HibernateTransactionManager transactionManager = new HibernateTransactionManager();
        transactionManager.setSessionFactory(sessionFactory().getObject());
        return transactionManager;
    }
}
这是应用程序。yml

spring:
    application:
        name: test
    profiles:
        active: dev
    datasource:
        type: com.zaxxer.hikari.HikariDataSource
        url: jdbc:mysql://localhost:3306/test?useUnicode=yes&characterEncoding=utf8&useSSL=false
        username: test
        password: test
        hikari:
          maximum-pool-size: 50
          data-source-properties:
                pool-name: test
                cachePrepStmts: true
                prepStmtCacheSize: 250
                prepStmtCacheSqlLimit: 2048
                useServerPrepStmts: true
    jpa:
        open-in-view: true
        database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
        database: MYSQL
        show-sql: true
        properties:
            hibernate.enable_lazy_load_no_trans: true
            hibernate.cache.use_second_level_cache: true
            hibernate.cache.use_query_cache: false
            hibernate.generate_statistics: true
            hibernate.dialect: org.hibernate.dialect.MySQL5Dialect
            hibernate.current_session_context_class: org.springframework.orm.hibernate5.SpringSessionContext
            hibernate.hbm2ddl.auto: update
<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-actuator</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-autoconfigure</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</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-logging</artifactId>
    </dependency>

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

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

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

    <dependency>
        <groupId>javax.inject</groupId>
        <artifactId>javax.inject</artifactId>
        <version>1</version>
    </dependency>
</dependencies>
这是
GenericRepository
类:

@Repository
public abstract class GenericRepository<T extends BaseEntity, PK extends Serializable> implements IGenericRepository<T, PK> {
    protected Class<T> domainClass = getDomainClass();

    protected abstract Class<T> getDomainClass();

    @Autowired
    SessionFactory sessionFactory;

    public Session getSession() {
        try {
            return sessionFactory.getCurrentSession();
        }
        catch (Exception e) {
            log.error(e.getMessage());
        }
        return sessionFactory.openSession();
    }

    @Override
    public void add(T entity) {
        Session session = getSession();
        session.save(entity);
    }

    // Other DAO layer methods here, removed for brevity
}
最后,在上述版本更改之后,当我检查
DataBaseConfiguration
类时,我发现
hibernatejbassessionfactorybean
已被弃用

然后我检查了另一个和这个问题相同的问题,但没有找到任何解决方案。
为了启动应用程序,我应该如何更改配置?

由于不推荐,javadoc似乎提出了一种替代方案:

从JPA2.1开始,
EntityManagerFactory.unwrap(java.lang.Class)
也提供了一种很好的方法,特别是在配置中 班级安排:

 @Bean
 public SessionFactory sessionFactory(
         @Qualifier("entityManagerFactory") EntityManagerFactory emf) {
     return emf.unwrap(SessionFactory.class);
 }
请注意:

请注意:自Hibernate 5.2更改其
会话工厂
界面以来 要扩展JPA的
EntityManagerFactory
,在 按类型注入,原始工厂和您的自定义
SessionFactory
匹配
EntityManagerFactory
。显式限定符 对于原始工厂(如上所示),建议在此处使用


由于不赞成,javadoc似乎提出了一个替代方案:

从JPA2.1开始,
EntityManagerFactory.unwrap(java.lang.Class)
也提供了一种很好的方法,特别是在配置中 班级安排:

 @Bean
 public SessionFactory sessionFactory(
         @Qualifier("entityManagerFactory") EntityManagerFactory emf) {
     return emf.unwrap(SessionFactory.class);
 }
请注意:

请注意:自Hibernate 5.2更改其
会话工厂
界面以来 要扩展JPA的
EntityManagerFactory
,在 按类型注入,原始工厂和您的自定义
SessionFactory
匹配
EntityManagerFactory
。显式限定符 对于原始工厂(如上所示),建议在此处使用


我将Hibernate 5.2与sessionfactory一起使用此配置

@Configuration
@EnableTransactionManagement
public class DatabaseConfiguration {

    @Inject
    public JpaProperties prop;

    @Bean
    @Primary
    @ConfigurationProperties("spring.datasource.hikari")
    public DataSourceProperties dataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @Primary
    @ConfigurationProperties("spring.datasource.hikari")
    public DataSource dataSource() {
        return dataSourceProperties().initializeDataSourceBuilder().build();
    }


    @Bean("sessionFactory")
    @Primary
    public LocalSessionFactoryBean getSessionFactory() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setPackagesToScan("org.roshan");
        sessionFactory.setAnnotatedPackages("org.roshan");
        sessionFactory.setHibernateProperties(getHibernateProperties());
        return sessionFactory;
    }

    private  Properties getHibernateProperties() {
        Properties p = new Properties();
        p.putAll(prop.getProperties());
        p.put(AvailableSettings.HBM2DDL_AUTO, prop.getHibernate().getDdlAuto());
        return p;
    }


    @Bean
    public HibernateTransactionManager transactionManager(@Autowired SessionFactory sessionFactory) {
        HibernateTransactionManager transactionManager = new HibernateTransactionManager();
        transactionManager.setSessionFactory(sessionFactory);
        return transactionManager;
    }

}
我的POM.xml属性

<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <hibernate.version>5.2.10.Final</hibernate.version>
</properties>

1.8
1.8
5.2.10.最终版本

我将Hibernate 5.2与sessionfactory一起使用此配置

@Configuration
@EnableTransactionManagement
public class DatabaseConfiguration {

    @Inject
    public JpaProperties prop;

    @Bean
    @Primary
    @ConfigurationProperties("spring.datasource.hikari")
    public DataSourceProperties dataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @Primary
    @ConfigurationProperties("spring.datasource.hikari")
    public DataSource dataSource() {
        return dataSourceProperties().initializeDataSourceBuilder().build();
    }


    @Bean("sessionFactory")
    @Primary
    public LocalSessionFactoryBean getSessionFactory() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setPackagesToScan("org.roshan");
        sessionFactory.setAnnotatedPackages("org.roshan");
        sessionFactory.setHibernateProperties(getHibernateProperties());
        return sessionFactory;
    }

    private  Properties getHibernateProperties() {
        Properties p = new Properties();
        p.putAll(prop.getProperties());
        p.put(AvailableSettings.HBM2DDL_AUTO, prop.getHibernate().getDdlAuto());
        return p;
    }


    @Bean
    public HibernateTransactionManager transactionManager(@Autowired SessionFactory sessionFactory) {
        HibernateTransactionManager transactionManager = new HibernateTransactionManager();
        transactionManager.setSessionFactory(sessionFactory);
        return transactionManager;
    }

}
我的POM.xml属性

<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <hibernate.version>5.2.10.Final</hibernate.version>
</properties>

1.8
1.8
5.2.10.最终版本

我使用了此配置,但出现了此异常:
****************************应用程序无法启动*************************************说明:com.rgh.framework.config.DataBaseConfiguration中方法sessionFactory的参数0需要一个找不到的“javax.persistence.EntityFactory”类型的bean。操作:考虑在您的配置中定义“javax持久性.EntInMaultMeCurror”类型的bean。< /代码>您可以添加示例<代码>数据库配置> <代码>作为答案吗?我使用了这个配置,但是得到了这个例外:<代码> ***************应用程序无法启动***********************************:参数0com.rgh.framework.config.DataBaseConfiguration中的方法sessionFactory需要一个找不到的“javax.persistence.EntityManagerFactory”类型的bean。操作:考虑在您的配置中定义“javax持久性.EntIngEngestRealFixor”的bean。< /Cord>可以添加示例<代码>数据库配置> <代码>这里吗?我得到了这个例外:<代码>:由Or.SrpFrrasWork.BeN.St.NouCheBeNejava定义异常:没有“Java.UTI.SET”类型的可获得bean:预期的:至少1个符合autowire候选资格的bean。依赖项批注:{}
是否可以发送完整的堆栈跟踪?您可以在此处看到堆栈跟踪我遇到此异常:
原因:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有类型为“java.util.Set”的符合条件的bean可用:至少需要1个符合autowire候选条件的bean。依赖项批注:{}
是否可以发送完整堆栈跟踪?您可以在此处看到堆栈跟踪