2010-04-29 6 views
23

Estoy tratando de obtener la configuración de hibernación definida por la primavera y los objetos SessionFactory en mi código que no sea Spring. La siguiente es la definición en mi archivo applicationContext.xml:¿Cómo puedo obtener el objeto de configuración de Hibernate de Spring?

Código:

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

Si ahora llamo getBean ("sessionFactory"), me he vuelto un objeto de $ Proxy0 que parece ser un indicador de el objeto Hibernate SessionFactory. Pero eso no es lo que quiero, necesito el LocalSessionFactoryBean en sí porque necesito acceder a Configuration así como a SessionFactory.

La razón por la que necesito el objeto Configuration es que nuestro framework puede usar el modelo dinámico de Hibernate para insertar automáticamente mapeos en tiempo de ejecución; esto requiere que cambiemos la Configuración y reconstruyamos SessionFactory. En realidad, todo lo que estamos tratando de hacer es obtener la configuración de Hibernate que ya existe en Spring para que aquellos de nuestros clientes que ya tienen esa información en Spring no necesiten duplicarla en un archivo hibernate.cfg.xml para utiliza nuestras funciones de Hibernate

+0

¿Y cómo reconstruir sessionFactory? ¿Y cómo se asegura de que todas las transacciones existentes hayan terminado antes de llamar a destroy? – banterCZ

Respuesta

38

Una característica oscura del contenedor primavera es the & prefix:

Cuando es necesario pedir un contenedor para un FactoryBean instancia real sí mismo, no el grano que produce, que prefacio, el bean id con el símbolo & (sin comillas) cuando llamando al método getBean ApplicationContext. Así que para una determinada FactoryBean con un id de myBean, invocando getBean("myBean") en el recipiente devuelve el producto de la FactoryBean, e invocando getBean("&myBean") devuelve la instancia FactoryBean sí mismo.

Por lo tanto, en su caso, con getBean("&sessionFactory") debe devolver la instancia LocalSessionFactoryBean. Luego puede llamar al .getConfiguration() para obtener el objeto Configuration.

+1

@skaffman ¡Buen trabajo! –

+0

Perfecto, exactamente lo que necesitaba, ¡gracias! –

+3

¿cómo podemos @Autowire esto? –

Cuestiones relacionadas