1. Робота з двома базами одночасно

Досить часто виникають ситуації, коли тобі потрібно працювати з двома базами одночасно. Наприклад, ти читаєш дані з однієї бази, обробляєш їх та пишеш до іншої.

Або ще частіший випадок. Твоя програма має одну локальну базу даних для роботи, а також може читати дані з різних віддалених джерел, які підтримують SQL-формат запиту даних. Наприклад, Excel.

Для цих віддалених джерел даних буває дуже корисно налаштувати свій Hibernate-мапінг, щоб бізнес-логіка програми могла бути простішою і працювати лише з Java-об'єктами.

Найпростіший спосіб це зробити — мати кілька файлів конфігурацій. Наприклад, так:

hibernate_oracle.cfg.xml
<hibernate-configuration>
   <session-factory>
      <property name="hibernate.dialect">org.hibernate.dialect.OracleDialect</property>
      <property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</property>
      <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:xe</property>
      <property name="hibernate.connection.username">system</property>
      <property name="hibernate.connection.password">secret<property>
 
      <mapping resource="com/javarush/hibernate/multipledatabase/employee.hbm.xml"/>
   </session-factory>
</hibernate-configuration>
hibernate_mysql.cfg.xml
<hibernate-configuration>
   <session-factory>
      <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
      <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
      <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/employee</property>
      <property name="hibernate.connection.username">root</property>
      <property name="hibernate.connection.password">secret</property>
 
      <mapping resource="com/javarush/hibernate/multipledatabase/employee.hbm.xml"/>
   </session-factory>
</hibernate-configuration>

Ну і весь код ініціалізації Hibernate фактично просто дублюється:


   Configuration oracleCfg = new Configuration();
   oracleCfg.configure("/com/javarush/hibernate/multipledatabase/hibernate_oracle.cfg.xml");
   SessionFactory oracleSessionFactory = oracleCfg.buildSessionFactory();
   Session oracleSession = oracleSessionFactory.openSession();
 
   Configuration mysqlCfg = new Configuration();
   mysqlCfg.configure("/com/javarush/hibernate/multipledatabase/hibernate_mysql.cfg.xml");
   SessionFactory mySqlSessionFactory = mysqlCfg.buildSessionFactory();
   Session mysqlSession = mySqlSessionFactory.openSession();
                                        
   Employee emp = oracleSession.get(Employee.class, "E0087");
   System.out.println("Employee retrived from Oracle Database");
                          
   Transaction tx = mysqlSession.beginTransaction();
   mysqlSession.save(emp);
   tx.commit();
   System.out.println("Employee inserted in MySQL Database");

2. База в пам'яті

Існують СУБД, які є базами даних, повністю розміщені в пам'яті. Такі СУБД часто поширюються просто у вигляді бібліотек, і їх легко включити у звичайну програму. Такими СУБД, наприклад, є H2 чи Hsqldb.

Додати їх до свого проєкту можна так само, як і будь-які інші бібліотеки — за допомогою залежності в Maven:

Hsqldb
<dependency>
    <groupId>org.hsqldb</groupId>
    <artifactId>hsqldb</artifactId>
    <version>2.6.1</version>
<scope>test</scope>
</dependency>

І одразу приклад другої бази:

H2 database
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>2.1.214</version>
    <scope>test</scope>
</dependency>

Конфігурувати роботу з ними можна так само, як зі звичайними базами. Але давай для зручності наведемо кілька прикладів:

Hsqldb
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">org.hsqldb.jdbc.JDBCDriver</property>
        <property name="hibernate.connection.url">jdbc:hsqldb:mem:test</property>
        <property name="hibernate.connection.username">sa</property>
        <property name="hibernate.connection.password"></property>
        <property name="hibernate.dialect">org.hibernate.dialect.HSQLDialect</property>
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.format_sql">true</property>
        <property name="hibernate.hbm2ddl.auto">create-drop</property>
        <property name="hibernate.current_session_context_class">thread</property>
    </session-factory>
</hibernate-configuration>

Ключова відмінність двох конфігурацій — це connection.url:

H2 database
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">org.h2.Driver</property>
        <property name="hibernate.connection.url">jdbc:h2:mem:test</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password"></property>
        <property name="hibernate.dialect">org.hibernate.dialect.H2Dialect</property>
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.format_sql">true</property>
<property name="hibernate.hbm2ddl.auto">create-drop</property>
        <property name="hibernate.current_session_context_class">thread</property>
    </session-factory>
</hibernate-configuration>