복붙노트

[SPRING] Spring, Hibernate 및 LocalSessionFactoryBuilder를 사용하여 sessionFactory를 구성하십시오.

SPRING

Spring, Hibernate 및 LocalSessionFactoryBuilder를 사용하여 sessionFactory를 구성하십시오.

스프링 3.2 및 최대 절전 모드 4를 사용하여 sessionFactory 빈을 만들려고합니다. 다음 코드를 사용했습니다. 그러나 문제는 buildSessionFactory ()가 더 이상 사용되지 않으며 buildSessionFactory (ServiceRegistry serviceRegistry)가 javadoc에서 대신 사용하도록 제안되었다는 것입니다. 그러나, 나는 ServiceRegistry가 무엇인지, 그리고 buildSessionFactory (ServiceRegistry serviceRegistry)를 사용하는 방법을 이해할 수 없다.


@Configuration
public class AppConfig {

    ...


    @Bean
    public SessionFactory sessionFactory() {
    return new LocalSessionFactoryBuilder(dataSource())
        .scanPackages("com.mypackages")
        .addProperties(hibernateProperties())
        .buildSessionFactory();

    }
}

해결법

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

    1.ServiceRegistry 인터페이스는 서비스의 개념 (Hibernate 4에서 새로 추가 된)과 관련이있다. 서비스는 Hibernate에 다양한 기능을 제공하고 사용자가 다른 구현을 플러그인 할 수있는 클래스이다. 자세한 내용은이 wiki 페이지를 참조하십시오.

    ServiceRegistry 인터페이스는 서비스의 개념 (Hibernate 4에서 새로 추가 된)과 관련이있다. 서비스는 Hibernate에 다양한 기능을 제공하고 사용자가 다른 구현을 플러그인 할 수있는 클래스이다. 자세한 내용은이 wiki 페이지를 참조하십시오.

    당신은 buildSessionFactory () 메소드가 buildSessionFactory (ServiceRegistry serviceRegistry) 메쏘드를 위해 Hibernate의 Configuration 클래스에서 더 이상 사용되지 않는다. (Spring이없는) 순수한 Hibernate 환경에서는 ServiceRegistry의 인스턴스를 다음과 같이 초기화 할 것이라고 가정한다.

    private static SessionFactory sessionFactory;
    private static ServiceRegistry serviceRegistry;
    
    private static SessionFactory configureSessionFactory() throws HibernateException {
        Configuration configuration = new Configuration();
        configuration.configure();
    
        serviceRegistry = new ServiceRegistryBuilder()
                 .applySettings(configuration.getProperties())
                 .buildServiceRegistry();
    
        sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        return sessionFactory;
    }
    

    하지만 이제는 deprecated 메소드 인 buildSessionFactory ()가 ServiceRegistry와 동일한 초기화 작업을 수행합니다.

    Spring의 LocalSessionFactoryBuilder 클래스는 Hibernate의 Configuration 클래스의 확장 일 뿐이다. 그러나 Spring의 모든 특정 작업은 Overriden 메소드 LocalSessionFactoryBuilder.buildSessionFactory ()에서 수행되므로 Spring 환경에서 buildSessionFactory (ServiceRegistry serviceRegistry) 메소드를 사용할 수 없습니다. 아무것도 똑같은 작업을 수행하는 buildSessionFactory ()를 사용하는 것이 좋습니다. AppConfig에서 @SuppressWarnings ( "deprecation") 메소드에 주석을 달고 Spring이 Hibernate 4와 더 나은 통합을 제공 할 때까지 기다리도록하자.

  2. ==============================

    2.또한 체인을 사용하지 않고 코드를 작성할 수 있습니다.

    또한 체인을 사용하지 않고 코드를 작성할 수 있습니다.

    LocalSessionFactoryBuilder builder = new LocalSessionFactoryBuilder(dataSource());
    builder.scanPackages("com.mypackages");
    builder.addProperties(hibernateProperties());
    return builder.buildSessionFactory();
    

    @SuppressWarnings ( "deprecation")과 약간 자세한 설명은 있지만 냄새는 아닙니다.

  3. ==============================

    3.Artem Shafranov가 제공 한 대답은 완전히 정확하지 않으며, 내가 한 것처럼 당신은 매우 혼란스러운 문제를 겪을 수도 있습니다.

    Artem Shafranov가 제공 한 대답은 완전히 정확하지 않으며, 내가 한 것처럼 당신은 매우 혼란스러운 문제를 겪을 수도 있습니다.

    사용하는 경우

    hibernate.hbm2ddl.auto
    

    hbm2dll의 연결 풀이 UserSuppliedConnectionProviderImpl (기본적으로 좋은 말 : null)로 설정되기 때문에 응용 프로그램이 시작되지 않습니다. 이 예외가 표시됩니다.

    org.hibernate.service.UnknownUnwrapTypeException: Cannot unwrap to requested type [javax.sql.DataSource]
    

    그 이유는 hbm2dll에서 사용하지만 Spring과 잘 작동하지 않는 ServiceRegistry와 관련이 있기 때문입니다. 제안 된 프로그래밍 방식 세션 구성 방법 중 많은 것을 사용하면 hbm2dll이 실행될 때 적절한 참조가 아직 없습니다.

    나를 위해 일한 유일한 방법은 다음과 같습니다.

    @Inject
    DataSource datasource;
    
    @Bean
    @SuppressWarnings("deprecation")
    public SessionFactory sessionFactory() throws IOException{
    
        LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
        sessionFactoryBean.setPackagesToScan("nl.your.model");
        sessionFactoryBean.setHibernateProperties(hibernateProperties());
        sessionFactoryBean.setDataSource(datasource);
        sessionFactoryBean.afterPropertiesSet();
    
        return sessionFactoryBean.getObject();
    }
    

    LocalSessionFactoryBuilder 사용에 실패했습니다. 놀랍게도 StandardServiceRegistryBuilder를 사용하여 실패했습니다.

    정말 혼란스러운 문제.

  4. from https://stackoverflow.com/questions/14806400/configure-sessionfactory-with-spring-hibernate-and-localsessionfactorybuilder by cc-by-sa and MIT license