2010-04-29 14 views
23

Sto cercando di ottenere gli oggetti Hibernate Configuration e SessionFactory definiti Spring nel mio codice non Spring. Quello che segue è la definizione nel mio file applicationContext.xml:Come posso ottenere l'oggetto Hibernate Configuration da Spring?

Codice:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="hibernateProperties"> 
    <props> 
     <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
     <prop key="hibernate.show_sql">true</prop> 
     <prop key="hibernate.hbm2ddl.auto">update</prop> 
     <prop key="hibernate.cglib.use_reflection_optimizer">true</prop> 
     <prop key="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</prop> 
    </props> 
    </property> 
    <property name="dataSource"> 
    <ref bean="dataSource"/> 
    </property> 
    </bean> 

Se ora io chiamo getBean ("sessionFactory"), sono tornato un oggetto $ Proxy0 che sembra essere una proxy l'oggetto Hibernate SessionFactory. Ma non è quello che voglio - ho bisogno del LocalSessionFactoryBean stesso perché ho bisogno di accedere alla Configurazione così come a SessionFactory.

Il motivo per cui ho bisogno dell'oggetto Configuration è che il nostro framework è in grado di utilizzare il modello dinamico di Hibernate per inserire automaticamente i mapping in fase di runtime; questo richiede che cambiamo la configurazione e ricostruiamo SessionFactory. In realtà, tutto ciò che stiamo cercando di fare è ottenere la configurazione di Hibernate che esiste già in primavera, in modo che quelli dei nostri clienti che hanno già queste informazioni in Spring non abbiano bisogno di duplicarli in un file hibernate.cfg.xml per usa le nostre funzionalità di ibernazione.

+0

E come si ricostruisce la sessioneFactory? E come ti assicuri che tutte le transazioni esistenti siano terminate prima di chiamare destroy? – banterCZ

risposta

38

Una caratteristica oscura del contenitore primavera è the & prefix:

Quando è necessario chiedere un contenitore per un vero e proprio FactoryBean esempio sé, non il fagiolo che produce, si precedere il id fagioli con la simbolo commerciale & (senza virgolette) quando chiama il metodo getBean dello ApplicationContext. Così, per un dato FactoryBean con un ID di myBean, invocando getBean("myBean") sul contenitore restituisce il prodotto della FactoryBean, e invocando getBean("&myBean") restituisce l'istanza FactoryBean stessa.

Quindi nel tuo caso, utilizzando getBean("&sessionFactory") dovrebbe restituirti l'istanza LocalSessionFactoryBean. Quindi è possibile chiamare .getConfiguration() per ottenere l'oggetto Configuration.

+1

@skaffman Buon lavoro! –

+0

Perfetto, esattamente quello di cui avevo bisogno - grazie! –

+3

come possiamo @Autowire questo? –

Problemi correlati