Hibernate 原因:java.lang.IllegalStateException:EntityManagerFactory不能为null
我以前使用的是Spring Boot1.4.2.RELEASE和Hibernate5.0.11.Final,这是我的数据库配置类: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() {
@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。依赖项批注:{}
是否可以发送完整堆栈跟踪?您可以在此处看到堆栈跟踪