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>