2010-08-10 4 views
8

Je travaille actuellement sur la construction d'une bibliothèque pour modulariser une partie de mon code et je rencontre un problème avec Hibernate.Configurations Hibernate multiples

Dans mon application principale, j'ai une configuration hibernate pour obtenir les informations dont elle a besoin, mais j'ai aussi besoin d'hiberner dans ma bibliothèque car certains des objets que je veux pourraient être utilisés dans d'autres applications. Lorsque je démarre mon serveur Tomcat, avec les deux configurations d'hibernation, j'obtiens des erreurs indiquant que les beans ne peuvent pas être résolus et une qui dit que mes paramètres positionnels sont manquants dans ma requête. Cependant, quand je démarre Tomcat avec seulement l'application Hibernate config, ça démarre très bien.

Voici ce que les configs ressemblent ...

De la bibliothèque:

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

Et de l'application:

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

Je suis encore assez nouveau pour Hibernate et ce est une sorte de configuration bizarre.

Répondre

12

Vous pouvez charger des fichiers de configuration d'hibernation par programmation.

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

Cela vous permettrait de créer deux objets SessionFactory. Cependant, je suppose que vous voulez utiliser la même SessionFactory pour votre application et votre module.

Vous pouvez charger les deux hiberner fichiers XML en un seul objet DOM (combiner enfants tag modules de "session-usine" avec Ones de votre application), puis utilisez le code suivant:

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

Edit: session- l'usine n'était pas imprimée car elle avait des caractères plus grands et moins que des caractères.

+0

Cela semble être ce que je cherche, mais permettez-moi de poser cette question. Serait-il préférable de laisser ma bibliothèque disposer de sa propre fabrique de sessions, ou devrais-je avoir une usine de session pour tout le projet? Pour ma situation, il semble que les usines à plusieurs sessions seraient plus appropriées, mais je ne sais pas si j'aurais des problèmes si je suivais cette voie. – Shaded

+0

Pour être honnête, je n'ai pas beaucoup d'expérience avec Hibernate. Cependant, d'après ce que vous décrivez, je pense que plusieurs objets SessionFactory semblent appropriés pour votre cas d'utilisation, car ils aident à modulariser votre code. Mais ne me croyez pas sur parole car je ne sais même pas s'il pourrait y avoir un impact sur les performances, par exemple ou tout autre problème. –

+0

Merci pour l'aide, je suis sûr que plusieurs est le chemin à parcourir. Je vais courir avec et j'espère que ça ne reviendra pas me mordre! Merci encore! – Shaded

2

Si vous voulez le faire, utilisez proprement le fragment Hibernate 1. Othewise vous pouvez tout simplement passer le chemin (le système de fichiers ou classpath) du hibernate.cfg.xml que vous souhaitez utiliser

De la bibliothèque

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

Et de l'application:

SessionFactory sf = new Configuration() 
     .configure("Fromtheapp.cfg.xml") 
     .buildSessionFactory(); 
Questions connexes