2010-08-10 12 views
8

Actualmente estoy trabajando en la construcción de una biblioteca para modularizar parte de mi código y tengo un problema con Hibernate.Configuraciones múltiples de Hibernate

En mi aplicación principal tengo una configuración de hibernación para obtener la información que necesita para funcionar, pero también necesito hibernar en mi biblioteca, ya que algunos de los objetos que deseo podrían usarse en otras aplicaciones.

Cuando inicio mi servidor tomcat, con la configuración de ambos hibernadores, recibo errores que indican que los beans no se pueden resolver y uno que dice que mis parámetros de posición faltan en mi consulta. Sin embargo, cuando inicio Tomcat con solo la configuración de Hibernate de la aplicación, comienza bien.

Esto es lo que las configuraciones se parecen ...

Desde la biblioteca:

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC 
     "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 

"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 

<hibernate-configuration> 


<session-factory> 
    <mapping resource="blah.hbm.xml"/> 
    <mapping resource="blargh.hbm.xml"/> 
    <mapping resource="stuff.hbm.xml"/> 
    <mapping resource="junk.hbm.xml"/> 
    <mapping resource="this.hbm.xml"/> 
</session-factory> 

</hibernate-configuration> 

Y a partir de la aplicación:

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC 
     "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 

"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 

<hibernate-configuration> 


<session-factory>  

    <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property> 

    <!-- Enable the query cache --> 
    <property name="hibernate.cache.use_query_cache">true</property> 

    <!-- Echo all executed SQL to stdout --> 
    <property name="show_sql">false</property> 

    <!-- mapping files --> 

    <mapping resource="appStuff"/> 
    <mapping resource="appBlah"/> 
    <mapping resource="appBlargh"/> 
    <mapping resource="appJunk"/> 
    <mapping resource="appThis"/>  

</session-factory> 

</hibernate-configuration> 

todavía soy bastante nuevo en Hibernate y esto es una especie de configuración extraña.

Respuesta

12

Puede cargar los archivos de configuración de hibernación de forma programática.

SessionFactory sf = new Configuration().configure("somename.cfg.xml").buildSessionFactory(); 

Eso le permitiría crear dos objetos SessionFactory. Sin embargo, supongo que desea utilizar el mismo SessionFactory para su aplicación y su módulo.

Se puede cargar tanto hibernación archivos XML en un único objeto DOM (combinar "session-factory" niños de la etiqueta de su módulo, con los de su aplicación) y luego utilizar el siguiente código:

import org.hibernate.cfg.Configuration; 
// ... 
SessionFactory sf = new Configuration().configure(yourDOMObject).buildSessionFactory(); 

Editar: session- fábrica no se imprimió porque tenía caracteres mayores que y menores que.

+0

Esto parece ser lo que estoy buscando, pero déjame preguntarte esto. ¿Sería mejor dejar que mi biblioteca tenga su propia fábrica de sesiones que pueda usar, o debería tener una fábrica de sesiones para todo? Para mi situación, parece que las fábricas de sesiones múltiples serían más apropiadas, pero no sé si me encontraré en problemas si sigo ese camino. – Shaded

+0

Para ser sincero, no tengo mucha experiencia con Hibernate. Sin embargo, por lo que describes, creo que varios objetos de SessionFactory parecen apropiados para tu caso de uso, ya que ayudan a modularizar tu código. Pero no tome mi palabra, ya que ni siquiera sé si podría haber algún impacto en el rendimiento, por ejemplo o cualquier otro problema. –

+0

Gracias por la ayuda, estoy bastante seguro de que el múltiple es el camino a seguir. ¡Voy a correr con eso y espero que no vuelva a morderme! ¡Gracias de nuevo! – Shaded

2

si desea hacerlo, utilice hibernate shard 1. Othewise puede simplemente pase la ruta (en el sistema de archivos o en la ruta de clase) de la hibernate.cfg.xml desea utilizar

Desde la biblioteca

SessionFactory sf = new Configuration() 
    .configure("Fromthelibrary.cfg.xml") 
    .buildSessionFactory(); 

Y a partir de la aplicación:

SessionFactory sf = new Configuration() 
     .configure("Fromtheapp.cfg.xml") 
     .buildSessionFactory(); 
Cuestiones relacionadas