2013-02-11 1 views
6

스프링 3.2 및 최대 절전 모드 4를 사용하여 sessionFactory 빈을 생성하려고합니다. 다음 코드를 사용했습니다. 그러나 문제는 buildSessionFactory()이며,이 아니며 javadoc 대신 buildSessionFactory(ServiceRegistry serviceRegistry)이 사용되는 것이 좋습니다. 그러나 ServiceRegistrybuildSessionFactory(ServiceRegistry serviceRegistry)의 사용법을 이해할 수 없습니다.Spring, Hibernate 및 LocalSessionFactoryBuilder로 sessionFactory를 구성하십시오.


@Configuration 
public class AppConfig { 

    ... 


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

    } 
} 

답변

9

ServiceRegistry 인터페이스는 서비스의 개념 (즉, 최대 절전 모드 4의 경우)과 관련됩니다. 서비스는 Hibernate에 다양한 기능을 제공하고 사용자가 다른 구현을 플러그인 할 수있는 클래스이다. 자세한 내용은 this wiki page을 참조하십시오.

buildSessionFactory() 메소드가 buildSessionFactory(ServiceRegistry serviceRegistry)에 찬성하여 Hibernate의 Configuration 클래스에서 더 이상 사용되지 않습니다. (봄 제외) 순수 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; 
} 

하지만 지금은 사용되지 않는 방법 buildSessionFactory()는 또한 당신을 위해 ServiceRegistry의 동일한 초기화를 수행하여

.

Spring의 LocalSessionFactoryBuilder 클래스는 Hibernate의 Configuration 클래스의 확장 일 뿐이다. 그러나 Spring의 모든 특정 작업은 오버라이드 된 메소드 LocalSessionFactoryBuilder.buildSessionFactory()에서 수행되므로 스프링 환경에서는 buildSessionFactory(ServiceRegistry serviceRegistry) 메서드를 사용할 수 없습니다. 아무것도 똑같은 일을하는 buildSessionFactory()을 사용하는 것이 좋습니다. 그래서 그냥 4

+0

이 답변을 최신 상태입니까? – dtrunk

+0

@dtrunk 내가하지 잘못 대답 해요 경우 봄 4.0.0.RC1에 대해서도 여전히 실제입니다 –

0

당신은 또한 체인없이 코드를 작성할 수 @SuppressWarnings("deprecation")AppConfig의 방법을 주석하고 참을성 봄이 최대 절전 모드와 더 나은 통합을 제공하기 위해 대기하자

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

약간 더 자세한하지만 같은 냄새 나는하지 @SuppressWarnings ("deprecation")

0

Artem Shafranov가 제공 한 답변은 완전히 정확하지 않으므로 내가 한 것처럼 매우 혼란스러운 문제가 발생할 수 있습니다.

당신이 hbm2dll에서 연결 풀은 UserSuppliedConnectionProviderImpl에 (말을 기본적으로 좋은 방법 : 널 (null))로 설정되기 때문에

hibernate.hbm2ddl.auto 

응용 프로그램이 시작되지 않습니다 사용하는 경우.

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

그 이유는 hbm2dll에 의해 사용되지만 봄에 좋은 재생되지 않습니다되는 ServiceRegistry를 함께 할 수있다 : 당신은이 예외를 볼 수 있습니다. 제안 된 프로그래밍 방식 세션 구성 방법을 많이 사용하면 hbm2dll이 실행될 때 적절한 참조가 아직 없습니다.

나를 위해 일한 유일한 방법은 LocalSessionFactoryBuilder이 실패하여 다음

@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(); 
} 

입니다. 놀랍게도 StandardServiceRegistryBuilder를 사용하는 것도 실패했습니다.

정말 혼란스러운 문제입니다.