2つの拠点を同時に操作する
2 つの拠点を同時に操作する必要がある状況がよくあります。たとえば、あるデータベースからデータを読み取り、処理して別のデータベースに書き込みます。
あるいはさらに一般的です。アプリケーションには、操作するローカル データベースが 1 つあり、SQL データ クエリ形式をサポートするさまざまなリモート ソースからデータを読み取ることもできます。例えばエクセル。
これらのリモート データ ソースの場合、アプリケーションのビジネス ロジックがより単純になり、Java オブジェクトのみで動作できるように Hibernate マッピングをカスタマイズすると非常に便利です。
これを行う最も簡単な方法は、複数の構成ファイルを用意することです。たとえば、次のようになります。
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/codegym/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/codegym/hibernate/multipledatabase/employee.hbm.xml"/>
</session-factory>
</hibernate-configuration>
|
実は、Hibernate の初期化コードはすべて、実際には複製されているだけです。
Configuration oracleCfg = new Configuration();
oracleCfg.configure("/com/codegym/hibernate/multipledatabase/hibernate_oracle.cfg.xml");
SessionFactory oracleSessionFactory = oracleCfg.buildSessionFactory();
Session oracleSession = oracleSessionFactory.openSession();
Configuration mysqlCfg = new Configuration();
mysqlCfg.configure("/com/codegym/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");
記憶のベース
DBMS という完全にメモリ内にあるデータベースがあります。このような DBMS は、単にライブラリとして配布されることが多く、一般的なアプリケーションに簡単に組み込むことができます。このような DBMS には、たとえば、H2 や Hsqldb があります。
これらは、Maven の依存関係を使用して、他のライブラリと同じ方法でプロジェクトに追加できます。
hsqldb |
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>2.6.1</version>
<scope>test</scope>
</dependency>
|
そしてすぐに 2 番目のベースの例:
H2データベース |
<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>
|
2 つの構成の主な違いは connection.url です。
H2データベース |
<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>
|
GO TO FULL VERSION