Как подключиться к нескольким базам данных в Hibernate

hibernate database

68749 просмотра

6 ответа

153 Репутация автора

Я новая пчела в Hibernate и пробую вещи. Одна вещь, которая, кажется, развлекает всех, это как подключиться к различным базам данных? У меня есть два вопроса здесь:

  1. Если в одном и том же веб-приложении мне нужно подключиться к MySQL и Oracle, как мне это сделать?
  2. Я использую MySQL и имею две базы данных test1 и test2, как подключиться и получить данные?

Я прочитал в блоге, что мы можем создавать различные конфигурационные файлы и делать это. Я попробовал, но безуспешно. Вот что я попробовал:

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

Где путь - это путь к файлу конфигурации. Это правильный путь?

Автор: akellakarthik Источник Размещён: 17.12.2009 01:40

Ответы (6)


2 плюса

3422 Репутация автора

В идеале вам следует перейти к типу распределенной транзакции системы [с использованием Java Transaction Analyzer org.hibernate.transaction.JTATransactionFactory] в этом случае. Если вы работаете на сервере приложений JBoss, вы можете сделать это с помощью «Распределенных менеджеров транзакций». Вы можете узнать больше об этом здесь .

Автор: Shamik Размещён: 17.12.2009 01:55

45 плюса

12102 Репутация автора

Решение

Используя сопоставления аннотаций в качестве примера:

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();

Затем используйте sf1 и sf2, чтобы получить сеансы для каждой базы данных. Для сопоставления файлов вы просто используете cfg.addClass вместо addAnnotatedClass. В этом случае поместите файлы cfg.xml в корневой пакет. У них будет Oracle или MySQL диалект и информация о соединении.

Автор: Brian Deterling Размещён: 17.12.2009 10:04

-1 плюса

11 Репутация автора

Вы можете соединить две базы данных test1 и test2, получить данные только с одним спящим режимом с некоторыми хитростями:

  • hibernate SQLQuery: просто добавьте имя базы данных с таблицей «select * from test1.table1», «select * from test2.table2»

  • персистентность гибернации: использование схемы ключей в xmlnate mapping xml

    <class name="Table1Class" table="table1" schema="test1"> <class name="Table2Class" table="table2" schema="test2">

Автор: MashiMaro Размещён: 10.03.2017 09:31

3 плюса

5686 Репутация автора

Это невозможно сделать с помощью одного файла конфигурации Hibernate. Вам нужно иметь два файла конфигурации для этого.

Настроить mysqlбазу данных

hibernate-mysql.cfg.xml

Настроить oracleбазу данных

hibernate-oracle.cfg.xml

В деталях, mysqlфайл конфигурации будет таким.

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

В деталях, oracleфайл конфигурации будет таким.

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

И код должен быть таким.

Конфигурация MySQL

private static SessionFactory sessionAnnotationFactory; 

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

Session session = sessionAnnotationFactory.openSession();

конфигурация оракула sql

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

Session session = sessionAnnotationFactory.openSession()
Автор: Dulith De Costa Размещён: 14.08.2017 01:49

0 плюса

24 Репутация автора

Вы также можете добавить класс отображения в файле configuration.xml

Примечание: это для аннотаций и для ресурсов используйте ключевое слово resources вместо класса

<mapping class="packageName.classNmae1"/>
<mapping class="packageName.classNmae2"/>
Автор: karan Размещён: 29.01.2018 10:33

1 плюс

8880 Репутация автора

Вы также можете использовать catalogсо значением другой базы данных

@Table(name = "foo", schema = "bar", catalog = "OtherDatabase")

Автор: Sam Barnum Размещён: 07.01.2019 08:47
Вопросы из категории :
32x32