需要一个找不到的“org.hibernate.SessionFactory”类型的bean
Posted
技术标签:
【中文标题】需要一个找不到的“org.hibernate.SessionFactory”类型的bean【英文标题】:required a bean of type 'org.hibernate.SessionFactory' that could not be found 【发布时间】:2017-09-17 22:10:32 【问题描述】:每当启动应用程序 Spring Boot 时都会出现以下错误。
应用程序启动失败
说明:
com.base.model.AbstractDao 中的字段会话需要一个无法找到的“org.hibernate.SessionFactory”类型的 bean。
行动:
考虑在你的配置中定义一个“org.hibernate.SessionFactory”类型的bean。
我添加了我的应用程序的实现:
POM.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>4.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Hibernate dependency -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.1.5.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.0.3.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.property
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username = root
spring.datasource.password = root
hibernate.dialect = org.hibernate.dialect.MySQLDialect
spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext
配置类
@Configuration
@EnableTransactionManagement
@ComponentScan("configure")
@PropertySource("classpath:application.properties")
public class HibernateConfiguration
@Autowired
private Environment environment;
@Bean
public LocalSessionFactoryBean sessionFactory()
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(dataSource());
sessionFactory.setPackagesToScan(new String[]"com.base","com.base.model");
sessionFactory.setMappingResources(new String[]"Employee.hbm.xml");
sessionFactory.setHibernateProperties(hibernateProperties());
return sessionFactory;
@Bean
public Properties hibernateProperties()
Properties properties = new Properties();
properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect"));
properties.put("hibernate.show_sql", environment.getRequiredProperty("hiberante.show_sql"));
properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql"));
return properties;
@Bean
public DataSource dataSource()
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(environment.getRequiredProperty("jdbc.driverClassName"));
dataSource.setUrl(environment.getRequiredProperty("jdbc.url"));
dataSource.setUsername(environment.getRequiredProperty("jdbc.userName"));
dataSource.setUsername(environment.getRequiredProperty("jdbc.password"));
return dataSource;
@Bean
public SessionFactory sessionFactory(HibernateEntityManagerFactory hemf)
return hemf.getSessionFactory();
Employee.java
public class Employee implements Serializable
/**
*
*/
private static final long serialVersionUID = 1L;
private int id;
private String name;
private String country;
public int getId()
return this.id;
public void setId(int id)
this.id = id;
public String getName()
return this.name;
public void setName(String name)
this.name = name;
public void setCountry(String country)
this.country = country;
public String getCountry()
return this.getCountry();
@Override
public String toString()
return "Employee [id=" + id + ", name=" + name + ", country="
+ country + "]";
Employee.hbm.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.base.model.Employee" table="Person">
<id name="id" type="java.lang.Integer">
<generator class="native"></generator>
</id>
<property name="name" type="java.lang.String">
<column name="name" not-null="true"></column>
</property>
<property name="country" type="java.lang.String">
<column name="country"></column>
</property>
</class>
</hibernate-mapping>
EmployeeDaoImpl
@Component
public class EmployeeDataDaoImpl
@Autowired
SessionFactory sessionFactory;
public List<Employee> findAllEmployee()
//// Criteria cri = getSession().createCriteria(Employee.class);
// List<Employee> dbList = cri.list();
// for (Employee employee : dbList)
// System.out.println(employee.getCountry());
//
return null;
我在 *** 上查找了相同的错误代码,但没有一个解决方案有效,因此再次将其与我的代码一起发布在这里。 希望其他人能指出我哪里出错了。
【问题讨论】:
【参考方案1】:对于初学者来说,您的配置有几件事
-
混合来自不同 Spring 和 Hibernate 版本的 jar
也可能已经管理依赖项
尝试比 Spring Boot 更智能。
对于 1. 和 2. 只需删除 spring-orm
的 <version>
标记以及 hibernate-core
和 hibernate-entitymanager
管理器依赖项。 Spring Boot 已经在管理这些。您实际上可以删除所有 org.springframework
依赖项,这些依赖项已经被启动器(实际上还有休眠的)引入。
<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-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
接下来在您的配置中,您至少配置了 2 个SessionFactory
。我建议使用注释来定义您的实体,而不是 hbm.xml
文件。
@Entity
@Table("person")
public class Employee implements Serializable
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private int id;
@Column(nullable=false)
private String name;
private String country;
当使用 JPA 注释时,Hibernate 会自动检测您的实体(尤其是与 Spring Boot 结合使用),这使得它非常强大。当然你现在可以删除你的Employee.hbm.xml
。
接下来你的EmployeeDataDaoImpl
我强烈建议使用纯JPA 而不是纯Hibernate。通常,这足以供您使用。
@Repository
public class EmployeeDataDaoImpl
@PersistenceContext
private EntityManager entityManger;
public List<Employee> findAllEmployee()
return em.createQuery("select e from Employee e", Employee.class).getResultList();
通过此设置,您基本上可以完全删除您的HibernateConfiguration
。是的,您可以,因为 Spring Boot 检测到 Hibernate 并自动创建 JpaTransactionManager
,启用事务并预配置 EntityManagerFactory
。
如果您真的想使用带有SessionFactory
的普通休眠模式,只需使用HibernateJpaSessionFactoryBean
来公开EntityManagerFactory
的底层SessionFactory
。
@Bean
public HibernateJpaSessionFactoryBean sessionFactory(EntityManagerFactory emf)
HibernateJpaSessionFactoryBean factory = new HibernateJpaSessionFactoryBean();
factory.setEntityManagerFactory(emf);
return factory;
但是如前所述,我强烈建议使用纯 JPA,因为它更容易设置,并且在 JPA 的当前状态下,它提供的功能几乎与纯 Hibernate 一样多。
专业提示
您依赖于 spring-boot-starter-data-jpa
,这意味着您依赖于 Spring Data JPA。如果您使用 JPA,这将使事情变得更加容易。您可以删除您的EmployeeDataDaoImpl
,然后创建一个界面并使用它。
public interface EmployeeRepository extends JpaRepository<Employee, Long>
就是这样,所有 CRUD 方法(findOne
、findAll
、save
等)都为您提供,无需您创建实现。
【讨论】:
我仍然收到“... 原因:org.hibernate.HibernateException:未配置 CurrentSessionContext!”使用 @Bean HibernateJpaSessionFactoryBean 时。我必须将“spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate5.SpringSessionContext”添加到application.properties 我如何使用它进行自定义【参考方案2】:您的 SessionFactory 配置错误。从你的 pom.xml 我看到你使用的是休眠版本 5,所以你的配置应该是:
spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate5.SpringSessionContext
而且你的 pom.xml 中有不同版本的 hibernate jar,尝试使用相同的版本。
【讨论】:
感谢您的回复,但问题依然存在以上是关于需要一个找不到的“org.hibernate.SessionFactory”类型的bean的主要内容,如果未能解决你的问题,请参考以下文章
Spring boot Field 需要一个找不到类型的 bean
签名的 JWT 被拒绝:需要另一个算法,或者找不到匹配的密钥
字段 vehicleRepository 需要一个找不到的 ..VehicleInterface 类型的 bean
需要一个找不到的“org.hibernate.SessionFactory”类型的bean
一个组件需要一个名为“dataSource”的 bean,但找不到该 bean
Springboot:需要一个找不到的“javax.persistence.EntityManagerFactory”类型的bean