web-dev-qa-db-fra.com

Comment se connecter à plusieurs bases de données dans Hibernate

Je suis une nouvelle abeille chez Hibernate et j'essaie des choses… Une chose qui semble amuser tout, c'est comment se connecter à différentes bases de données?

  1. Si je dois me connecter à MySQL et à Oracle dans la même application Web, comment puis-je le faire? 
  2. J'utilise MySQL et ai deux bases de données test1 et test2, comment se connecter et récupérer des données?

J'ai lu dans un blog que nous pouvons créer différents fichiers de configuration et le faire .. J'ai essayé mais je n'ai pas réussi ... Voici ce que j'ai essayé: 

SessionFactory sf = (SessionFactory) new Configuration().configure(path);

Où chemin est le chemin du fichier de configuration . Est-ce la bonne façon?

22
akellakarthik

Utilisation des mappages d'annotations à titre d'exemple:

Configuration cfg1 = new AnnotationConfiguration();
cfg1.configure("/hibernate-Oracle.cfg.xml");
cfg1.addAnnotatedClass(SomeClass.class); // mapped classes
cfg1.addAnnotatedClass(SomeOtherClass.class);
SessionFactory sf1 = cfg1.buildSessionFactory();

Configuration cfg2 = new AnnotationConfiguration();
cfg2.configure("/hibernate-mysql.cfg.xml");
cfg2.addAnnotatedClass(SomeClass.class); // could be the same or different than above
cfg2.addAnnotatedClass(SomeOtherClass.class);
SessionFactory sf2 = cfg2.buildSessionFactory();

Ensuite, utilisez sf1 et sf2 pour obtenir les sessions pour chaque base de données. Pour les fichiers de mappage, utilisez simplement cfg.addClass au lieu de addAnnotatedClass. Placez les fichiers cfg.xml dans le package racine dans ce cas. Ceux-ci auront le dialecte Oracle ou MySQL et les informations de connexion.

38
Brian Deterling

Cela ne peut pas être fait avec un seul fichier de configuration Hibernate. Vous devez avoir deux fichiers de configuration pour cela.

Pour configurer la base de données mysql

hibernate-mysql.cfg.xml

Pour configurer la base de données Oracle

hibernate-Oracle.cfg.xml

Dans Détails, le fichier de configuration mysql soit comme ceci.

<?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.bytecode.use_reflection_optimizer">false</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.password">PASSWORD</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/UR_DB_NAME</property>
        <property name="hibernate.connection.username">USERNAME</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="show_sql">true</property>
        <mapping class="domain.EmployeeMysql"></mapping>
    </session-factory>
</hibernate-configuration>

Dans Détails, le fichier de configuration Oracle soit comme ceci.

<?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.bytecode.use_reflection_optimizer">false</property>
        <property name="hibernate.connection.driver_class">Oracle.jdbc.driver.OracleDriver</property>
        <property name="hibernate.connection.password">PASSWORD</property>
        <property name="hibernate.connection.url">jdbc:Oracle:thin:UR DB NAME</property>
        <property name="hibernate.connection.username">USERNAME</property>
        <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
        <property name="show_sql">true</property>
        <mapping class="domain.EmployeeOracleSql"></mapping>
    </session-factory>
</hibernate-configuration>

Et le code devrait être comme ça.

configuration de mysql

private static SessionFactory sessionAnnotationFactory; 

sessionAnnotationFactory = new Configuration().configure("hibernate-mysql.cfg.xml").buildSessionFactory();

Session session = sessionAnnotationFactory.openSession();

Configuration Oracle SQL

sessionAnnotationFactory = new Configuration().configure("hibernate-Oracle.cfg.xml").buildSessionFactory();

Session session = sessionAnnotationFactory.openSession()
3
Dulith De Costa

Idéalement, vous devez passer au type de système de transaction distribuée [à l'aide de Java Transaction Analyzer org.hibernate.transaction.JTATransactionFactory] dans ce cas. Si vous utilisez JBoss App Server, vous pouvez le faire en utilisant "Gestionnaires de transactions distribuées". Vous pouvez en apprendre plus à ce sujet ici .

2
Shamik

Vous pouvez également ajouter une classe de mappage dans le fichier configuration.xml.

Remarque: il s’agit des annotations et des ressources, utilisez le mot-clé resources au lieu de la classe

<mapping class="packageName.classNmae1"/>
<mapping class="packageName.classNmae2"/>
0
karan