2013-02-11 22 views
6

Sto cercando di creare il bean sessionFactory utilizzando spring 3.2 e hibernate 4. Ho usato il seguente codice per quello. Ma il problema è buildSessionFactory() è deprecato e lo buildSessionFactory(ServiceRegistry serviceRegistry) è consigliato per l'uso in javadoc. Tuttavia, non sono in grado di capire che cos'è ServiceRegistry e come utilizzare buildSessionFactory(ServiceRegistry serviceRegistry).Configura sessionFactory con Spring, Hibernate e LocalSessionFactoryBuilder


@Configuration 
public class AppConfig { 

    ... 


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

    } 
} 

risposta

9

ServiceRegistry interfaccia è legata al concetto di servizi (che è nuovo per Hibernate 4). I servizi sono classi che forniscono Hibernate con varie funzionalità e per cui l'utente può collegare implementazioni alternative. Vedi this wiki page per i dettagli.

Avete ragione che il metodo buildSessionFactory() è deprecato nella classe Configuration di Hibernate a favore del metodo buildSessionFactory(ServiceRegistry serviceRegistry). Nell'ambiente di un Hibernate puro (senza molla) si suppone che si inizializzare un'istanza di ServiceRegistry in modo tale:

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

Ma ormai il metodo deprecato buildSessionFactory() fa anche lo stesso inizializzazione del ServiceRegistry per voi.

Spring's LocalSessionFactoryBuilder classe è solo l'estensione della classe Configuration di Hibernate. Ma poiché tutto il lavoro specifico di Spring viene eseguito con il metodo overrid LocalSessionFactoryBuilder.buildSessionFactory() non è possibile utilizzare il metodo buildSessionFactory(ServiceRegistry serviceRegistry) nell'ambiente Spring. Non c'è molto perché è ok usare buildSessionFactory() che fa esattamente lo stesso lavoro. Così facciamo solo annotare il metodo in AppConfig con @SuppressWarnings("deprecation") e pazientemente aspettare la primavera per fornire una migliore integrazione con Hibernate 4.

+0

questa risposta è aggiornata? – dtrunk

+0

@dtrunk Se non sbaglio la risposta è ancora attuale anche per Spring 4.0.0.RC1 –

0

si potrebbe anche scrivere il codice senza il concatenamento:

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

Un po 'più prolisso, ma non così puzzolente come @SuppressWarnings ("deprecazione")

0

La risposta fornita da Artem Shafranov non è del tutto corretta e si potrebbe incorrere in un problema molto confuso come ho fatto.

Se si utilizza

hibernate.hbm2ddl.auto 

l'applicazione non si avvia perché il pool di connessioni in hbm2dll verrà impostata su UserSuppliedConnectionProviderImpl (in pratica un bel modo per dire: null). Vedrete questa eccezione:

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

La ragione di questo ha a che fare con la ServiceRegistry che è usato da hbm2dll, ma che non gioca sempre pulito con la Primavera. Usando molti dei metodi di configurazione delle sessioni programmatiche suggeriti, non avrà ancora il riferimento corretto quando viene eseguito hbm2dll.

L'unico modo che ha funzionato per me è la seguente

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

Utilizzando LocalSessionFactoryBuilder fallito. Usando StandardServiceRegistryBuilder, sorprendentemente, anche fallito.

Problema davvero confuso.

Problemi correlati