2013-02-11 4 views
6

J'essaie de créer un bean sessionFactory en utilisant spring 3.2 et hibernate 4. J'ai utilisé le code suivant pour cela. Mais le problème est buildSessionFactory() est déconseillé et le buildSessionFactory(ServiceRegistry serviceRegistry) est suggéré d'utiliser à la place dans javadoc. Cependant, je ne suis pas en mesure de comprendre ce qui est ServiceRegistry et comment utiliser buildSessionFactory(ServiceRegistry serviceRegistry).Configurer sessionFactory avec Spring, Hibernate et LocalSessionFactoryBuilder


@Configuration 
public class AppConfig { 

    ... 


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

    } 
} 

Répondre

9

Interface ServiceRegistry est liée à concept de services (ce qui est nouveau pour Hibernate 4). Les services sont des classes qui fournissent à Hibernate diverses fonctionnalités et pour lesquelles l'utilisateur peut brancher d'autres implémentations. Voir this wiki page pour plus de détails.

Vous avez raison: la méthode buildSessionFactory() est déconseillée dans la classe Configuration de Hibernate en faveur de la méthode buildSessionFactory(ServiceRegistry serviceRegistry). Dans un pur environnement de mise en veille prolongée (sans ressort), il est supposé que vous initialiser instance de ServiceRegistry de telle manière:

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; 
} 

Mais maintenant la méthode désapprouvée buildSessionFactory() fait également la même initialisation de ServiceRegistry pour vous.

La classe LocalSessionFactoryBuilder de Spring est juste l'extension de la classe Configuration de Hibernate. Mais puisque tout le travail spécifique de Spring est fait dans la méthode surchargée LocalSessionFactoryBuilder.buildSessionFactory() vous ne pouvez pas utiliser la méthode buildSessionFactory(ServiceRegistry serviceRegistry) dans l'environnement de Spring. Rien de bien parce que c'est bon d'utiliser buildSessionFactory() qui fait exactement le même travail. Donc, nous allons annoter juste la méthode AppConfig avec @SuppressWarnings("deprecation") et patiemment attendre le printemps pour fournir une meilleure intégration avec Hibernate 4.

+0

cette réponse est-elle à jour? – dtrunk

+0

@dtrunk Si je ne me trompe pas, la réponse est encore réelle même pour Spring 4.0.0.RC1 –

0

Vous pouvez aussi écrire le code sans enchaînant:

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

Un peu plus bavard, mais pas aussi nauséabond comme @SuppressWarnings ("deprecation")

0

La réponse fournie par Artem Shafranov n'est pas tout à fait correcte et vous pourriez rencontrer un problème très confus comme je l'ai fait.

Si vous utilisez

hibernate.hbm2ddl.auto 

votre application ne démarre pas parce que le pool de connexion à hbm2dll sera mis à UserSuppliedConnectionProviderImpl (essentiellement une belle façon de dire: null). Vous verrez cette exception:

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

La raison doit faire avec le ServiceRegistry qui est utilisé par hbm2dll mais qui ne joue pas bien avec le printemps. En utilisant la plupart des méthodes de configuration de session programmatique suggérées, il n'aura pas encore la bonne référence quand hbm2dll est exécuté.

La seule façon qui a fonctionné pour moi est la suivante

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

L'utilisation LocalSessionFactoryBuilder a échoué. En utilisant StandardServiceRegistryBuilder, étonnamment, échoué aussi.

Vraiment déroutant.

Questions connexes