每当启动应用程序spring启动时,我都会收到以下错误。
申请开始失败
描述:
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>
应用属性
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>
员工DaoImpl
@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; } }
我在stackoverflow上查找了相同的错误代码,但没有任何解决方案起作用,因此将其与我的代码一起再次发布在这里。希望别人可以指出我要去哪里。
对于初学者来说,您的配置有几件事情
对于1.和2.,只需删除和和经理依赖项的<version>标签。Spring Boot已经在管理那些。实际上,您可以删除启动器已经引入的所有依赖项(实际上也包括hibernate的依赖项)。spring-orm``hibernate- core``hibernate-entitymanager``org.springframework
<version>
spring-orm``hibernate- core``hibernate-entitymanager``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>
接下来,在您的配置中,至少SessionFactory配置了2个。我建议使用注释来定义您的实体而不是hbm.xml文件。
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我强烈建议在普通的Hibernate上使用普通的JPA。通常,这为您提供了足够的工作机会。
EmployeeDataDaoImpl
@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。
HibernateConfiguration
JpaTransactionManager
EntityManagerFactory
如果你真的想使用纯hibernate与SessionFactory只使用一个HibernateJpaSessionFactoryBean,露出底层SessionFactory的EntityManagerFactory。
HibernateJpaSessionFactoryBean
@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的界面,然后创建一个界面并使用它。
spring-boot-starter-data-jpa
public interface EmployeeRepository extends JpaRepository<Employee, Long> {}
这就是它,所有的CRUD方法(findOne,findAll,save提供等)为您无需您创建一个实现。
findOne
findAll
save