[SPRING] 찾을 수없는 'org.hibernate.SessionFactory'유형의 bean이 필요합니다.
SPRING찾을 수없는 'org.hibernate.SessionFactory'유형의 bean이 필요합니다.
응용 프로그램을 시작할 때마다 다음 오류가 발생합니다.
애플리케이션 시작 실패
기술:
com.base.model.AbstractDao의 필드 세션에서 찾을 수없는 'org.hibernate.SessionFactory'유형의 bean이 필요했습니다.
동작:
컨피규레이션에서 'org.hibernate.SessionFactory'유형의 bean을 정의 해보십시오.
내 응용 프로그램의 구현을 추가했습니다.
POM.HML
<?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;
}
}
내가 stackoverflow에 동일한 오류 코드를 찾았지만, 솔루션의 아무도 일하고 따라서 여기에 내 코드와 함께 게시. 다른 사람이 나에게 잘못 가고 있다는 것을 지적 할 수 있습니다.
해결법
-
==============================
1.처음에는 설정과 관련된 몇 가지 사항이 있습니다.
처음에는 설정과 관련된 몇 가지 사항이 있습니다.
1.와 2.의 경우 spring-orm에 대한
태그와 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 나는 평범한 Hibernate보다 평범한 JPA를 사용하도록 강력히 제안한다. 일반적으로 당신이 일하기에 충분합니다.
@Repository public class EmployeeDataDaoImpl { @PersistenceContext private EntityManager entityManger; public List<Employee> findAllEmployee(){ return em.createQuery("select e from Employee e", Employee.class).getResultList(); } }
이 설정을 사용하면 기본적으로 HibernateConfiguration을 완전히 제거 할 수 있습니다. 예, 스프링 부트가 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-startter-data-jpa에 대한 의존성이 있습니다. 이는 Spring Data JPA에 의존하고 있음을 의미합니다. JPA를 사용하면 더 쉽게 만들 수 있습니다. EmployeeDataDaoImpl을 제거하고 인터페이스를 생성하여 사용할 수 있습니다.
public interface EmployeeRepository extends JpaRepository<Employee, Long> {}
즉, 구현을 만들지 않고도 모든 CRUD 메소드 (findOne, findAll, save 등)가 제공됩니다.
-
==============================
2.SessionFactory 구성이 잘못되었습니다. pom.xml에서 최대 절전 모드 버전 5를 사용하고 있으므로 구성이 다음과 같아야합니다.
SessionFactory 구성이 잘못되었습니다. pom.xml에서 최대 절전 모드 버전 5를 사용하고 있으므로 구성이 다음과 같아야합니다.
spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate5.SpringSessionContext
또한 pom.xml에 다른 버전의 hibernate jar를 가지고 있고, 같은 버전을 사용해보십시오.
from https://stackoverflow.com/questions/43533691/required-a-bean-of-type-org-hibernate-sessionfactory-that-could-not-be-found by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 버블 부팅을 지원하는 gradle 연속 빌드가 있습니까? (0) | 2019.02.23 |
---|---|
[SPRING] 스프링 데이터의 페이지 매김 JPA (한계 및 오프셋) (0) | 2019.02.23 |
[SPRING] 스프링 레스트 컨트롤러 : 유효성을 선택적으로 끄는 방법 (0) | 2019.02.23 |
[SPRING] access_token : spring boot Oauth2로 리소스에 액세스 할 수 없습니다. (0) | 2019.02.23 |
[SPRING] 하나의 Service 메소드는 Spring 트랜잭션을위한 내부 다중 메소드를 호출한다. (0) | 2019.02.23 |