복붙노트

[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.처음에는 설정과 관련된 몇 가지 사항이 있습니다.

    처음에는 설정과 관련된 몇 가지 사항이 있습니다.

    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. ==============================

    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를 가지고 있고, 같은 버전을 사용해보십시오.

  3. 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