Bekerja dengan dua pangkalan pada masa yang sama

Selalunya terdapat situasi apabila anda perlu bekerja dengan dua pangkalan pada masa yang sama. Sebagai contoh, anda membaca data daripada satu pangkalan data, memprosesnya dan menulisnya kepada yang lain.

Atau lebih biasa. Aplikasi anda mempunyai satu pangkalan data tempatan untuk digunakan, dan juga boleh membaca data daripada pelbagai sumber jauh yang menyokong format pertanyaan data SQL. Contohnya Excel.

Untuk sumber data jauh ini, ia boleh menjadi sangat berguna untuk menyesuaikan pemetaan Hibernate anda supaya logik perniagaan aplikasi boleh menjadi lebih mudah dan berfungsi hanya dengan objek Java.

Cara paling mudah untuk melakukan ini ialah mempunyai berbilang fail konfigurasi. Sebagai contoh, seperti ini:

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>

Nah, semua kod permulaan Hibernate sebenarnya hanya diduplikasi:

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

asas dalam ingatan

Terdapat DBMS, iaitu pangkalan data yang berada dalam ingatan sepenuhnya. DBMS sedemikian sering diedarkan hanya sebagai perpustakaan dan mudah untuk disertakan dalam aplikasi biasa. DBMS tersebut, sebagai contoh, ialah H2 atau Hsqldb.

Anda boleh menambahkannya pada projek anda dengan cara yang sama seperti mana-mana perpustakaan lain - menggunakan kebergantungan dalam Maven:

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

Dan segera contoh asas kedua:

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

Anda boleh mengkonfigurasi kerja dengan mereka dengan cara yang sama seperti pangkalan data biasa. Tetapi mari kita berikan beberapa contoh untuk kemudahan:

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>

Perbezaan utama antara dua konfigurasi ialah connection.url:

pangkalan data 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>