Arbeiten mit zwei Basen gleichzeitig

Sehr oft gibt es Situationen, in denen Sie mit zwei Basen gleichzeitig arbeiten müssen. Sie lesen beispielsweise Daten aus einer Datenbank, verarbeiten sie und schreiben sie in eine andere.

Oder noch häufiger. Ihre Anwendung verfügt über eine lokale Datenbank, mit der sie arbeiten kann, und kann auch Daten aus verschiedenen Remotequellen lesen, die das SQL-Datenabfrageformat unterstützen. Zum Beispiel Excel.

Für diese Remote-Datenquellen kann es sehr nützlich sein, Ihre Hibernate-Zuordnung anzupassen, damit die Geschäftslogik der Anwendung einfacher ist und nur mit Java-Objekten funktioniert.

Der einfachste Weg, dies zu tun, besteht darin, mehrere Konfigurationsdateien zu haben. Zum Beispiel so:

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>

Nun, der gesamte Hibernate-Initialisierungscode ist eigentlich nur dupliziert:

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

Basis im Gedächtnis

Es gibt DBMS, das sind Datenbanken, die vollständig im Speicher liegen. Solche DBMS werden oft einfach als Bibliotheken verteilt und lassen sich leicht in eine typische Anwendung integrieren. Solche DBMS sind beispielsweise H2 oder Hsqldb.

Sie können sie auf die gleiche Weise wie alle anderen Bibliotheken zu Ihrem Projekt hinzufügen – mithilfe einer Abhängigkeit in Maven:

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

Und gleich ein Beispiel für die zweite Basis:

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

Sie können die Arbeit mit ihnen auf die gleiche Weise konfigurieren wie mit regulären Datenbanken. Aber lassen Sie uns der Einfachheit halber ein paar Beispiele nennen:

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>

Der Hauptunterschied zwischen den beiden Konfigurationen ist die Connection.URL:

H2-Datenbank
<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>