Как подключиться к нескольким базам данных в Hibernate
Я новая пчела в Hibernate и пробую вещи.
Одна вещь, которая, кажется, развлекает всех, как подключиться к различным базам данных?
У меня есть два вопроса:
- Если в том же веб-приложении мне нужно подключиться к MySQL и Oracle, как мне это сделать?
- Я использую MySQL и имею две базы данных test1 и test2, как подключать и извлекать данные?
Я прочитал в блоге, что мы можем создавать разные файлы конфигурации и делать это.
Я попробовал, но не был успешным.
Вот что я пробовал:
SessionFactory sf = (SessionFactory) new Configuration().configure(path);
Где путь - это путь к файлу конфигурации.
Правильно ли это?
Ответы
Ответ 1
Использование сопоставлений аннотации в качестве примера:
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.
Ответ 2
В идеале вам следует перейти к типу распределенной транзакции [с использованием Java Transaction Analyzer org.hibernate.transaction.JTATransactionFactory] в этом случае. Если вы работаете в JBoss App Server, вы можете сделать это, используя "Менеджеры распределенных транзакций". Вы можете узнать больше об этом здесь.
Ответ 3
Вы можете подключить две базы данных test1 и test2, получить данные только с одним спящим с некоторыми трюками:
-
hibernate SQLQuery: просто добавьте имя базы данных в таблицу "select * from test1.table1", "select * from test2.table2"
-
сохранение hibernate: использование схемы ключей в сопоставлении hibernate xml
<class name="Table1Class" table="table1" schema="test1">
<class name="Table2Class" table="table2" schema="test2">
Ответ 4
Это невозможно сделать с использованием одного конфигурационного файла спящего режима. Для этого вам нужно иметь два файла конфигурации.
Чтобы настроить базу данных 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()