복붙노트

[SPRING] Spring Boot / Thymeleaf / Hibernate : Java Annotation을 사용한 Sessionfactory Bean

SPRING

Spring Boot / Thymeleaf / Hibernate : Java Annotation을 사용한 Sessionfactory Bean

저는 Thymeleaf와 Hibernate를 사용하여 IntelliJ로 Spring Boot 웹 어플리케이션을 만들었습니다. 지금까지 모든 db 연결을 만들 수 있었고 정상적으로 작동합니다. 내가 본 것만 큼 Sessionfactory를 bean으로 갖고 db 액션을 수행하는 모든 서비스 클래스에서 autowire하는 좋은 방법이 될 것입니다.

SpringMvcConfiguration을 다음과 같은 구성 파일로 가지고 있습니다 :

package eu.barz.familykurse.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;
import java.util.Locale;


@Configuration
public class SpringMvcConfiguration extends WebMvcConfigurerAdapter{
    @Bean
    public LocaleResolver localeResolver(){
        SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
        sessionLocaleResolver.setDefaultLocale(Locale.GERMAN);
        return sessionLocaleResolver;
    }

    @Bean
    LocaleChangeInterceptor localeChangeInterceptor(){
        LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
        localeChangeInterceptor.setParamName("lang");
        return  localeChangeInterceptor;
    }

    @Override
    public void addInterceptors(InterceptorRegistry interceptorRegistry){
        interceptorRegistry.addInterceptor(localeChangeInterceptor());
    }
}

질문 : 많이 시도했지만 SessionFactory에 대한 빈을 선언하는 솔루션을 찾을 수 없습니다.

어떤 힌트라도 도움이 될 것입니다. sessionfactory 및 datasource를 여기에 선언해야합니까? 그렇지 않으면 application.properties에 있거나 hibernate.cfg.xml에 있어야합니다. 현재는 다음과 같습니다.

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="connection.url">jdbc:mysql://localhost:3306/family_kurse</property>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.username">username</property>
        <property name="connection.password">secret</property>

        <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
        <property name="hibernate.current_session_context_class">thread</property>
        <property name="show_sql">true</property>
        <mapping class="eu.barz.familykurse.domain.Leader"/>
        <mapping class="eu.barz.familykurse.domain.Course"/>

        <!-- DB schema will be updated if needed -->
        <!-- <property name="hbm2ddl.auto">update</property> -->
    </session-factory>
</hibernate-configuration>

건배 마이크

해결책:

해결법

  1. ==============================

    1.스프링 부트를 사용하고 있으므로 데이터베이스 구성에 XML 구성을 사용해야합니다. Spring 부트를 Hibernate와 통합하려면 다음과 같이 LocalSessionFactoryBean, DataSource, HibernateTransactionManager 및 PersistenceExceptionTranslationPostProcessor Bean을 생성해야합니다.

    스프링 부트를 사용하고 있으므로 데이터베이스 구성에 XML 구성을 사용해야합니다. Spring 부트를 Hibernate와 통합하려면 다음과 같이 LocalSessionFactoryBean, DataSource, HibernateTransactionManager 및 PersistenceExceptionTranslationPostProcessor Bean을 생성해야합니다.

    @Configuration
    public class DatabaseConfig {
    
        @Bean
        public LocalSessionFactoryBean sessionFactory() {
            LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
            sessionFactory.setDataSource(dataSource());
            sessionFactory.setPackagesToScan("com.example.model");
            sessionFactory.setHibernateProperties(hibernateProperties());
    
            return sessionFactory;
        }
    
        @Bean
        public DataSource dataSource() {
            DriverManagerDataSource dataSource = new DriverManagerDataSource();
            dataSource.setDriverClassName("org.postgresql.Driver");
            dataSource.setUrl("jdbc:postgresql://localhost:5432/testdb");
            dataSource.setUsername("root");
            dataSource.setPassword("root");
    
            return dataSource;
        }
    
        @Bean
        @Autowired
        public HibernateTransactionManager transactionManager(SessionFactory sessionFactory) {
    
            HibernateTransactionManager txManager = new HibernateTransactionManager();
            txManager.setSessionFactory(sessionFactory);
    
            return txManager;
        }
    
        @Bean
        public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
            return new PersistenceExceptionTranslationPostProcessor();
        }
    
        Properties hibernateProperties() {
            Properties properties = new Properties();
            properties.setProperty("hibernate.ddl-auto", "update");
            properties.setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
            return properties;
        }
    }
    

    위의 데이터베이스 구성에서 나는 postgreSQL 데이터베이스를 사용했습니다.

    다음과 같이 SessionFactory autowire SessionFactory 인터페이스의 인스턴스를 가져 오려면 :

     @Autowired
     SessionFactory sessionFactory;
    
  2. ==============================

    2.나는이 예를 여기서 취했다.

    나는이 예를 여기서 취했다.

    @Bean
       public LocalSessionFactoryBean sessionFactory() {
          LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
          sessionFactory.setDataSource(restDataSource());
          sessionFactory.setPackagesToScan(
            new String[] { "org.baeldung.spring.persistence.model" });
          sessionFactory.setHibernateProperties(hibernateProperties());
    
          return sessionFactory;
       }
    
       @Bean
       public DataSource restDataSource() {
          BasicDataSource dataSource = new BasicDataSource();
          dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
          dataSource.setUrl(env.getProperty("jdbc.url"));
          dataSource.setUsername(env.getProperty("jdbc.user"));
          dataSource.setPassword(env.getProperty("jdbc.pass"));
    
          return dataSource;
       }
    
  3. ==============================

    3.이거 해봤 니?

    이거 해봤 니?

    @Bean
    public org.springframework.orm.hibernate5.LocalSessionFactoryBean sessionFactory(){
        org.springframework.orm.hibernate5.LocalSessionFactoryBean sessionFactory = new org.springframework.orm.hibernate5.LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        return sessionFactory;
    }
    @Bean
    public DataSource dataSource() {
    
      BasicDataSource dataSource = new BasicDataSource();
      dataSource.setDriverClassName("jdbc.driverClassName");
      dataSource.setUrl("jdbc.url");
      dataSource.setUsername("jdbc.user");
      dataSource.setPassword("jdbc.pass");
    
      return dataSource;
    }
    
  4. from https://stackoverflow.com/questions/45893879/spring-boot-thymeleaf-hibernate-sessionfactory-bean-with-java-annotations by cc-by-sa and MIT license