Aynı anda iki tabanla çalışma

Çoğu zaman, aynı anda iki tabanla çalışmanız gereken durumlar vardır. Örneğin, bir veritabanındaki verileri okur, işler ve başka bir veritabanına yazarsınız.

Ya da daha yaygın. Uygulamanızın birlikte çalışacağı bir yerel veritabanı vardır ve SQL veri sorgulama biçimini destekleyen çeşitli uzak kaynaklardan gelen verileri de okuyabilir. Örneğin Excel'de.

Bu uzak veri kaynakları için, uygulamanın iş mantığının daha basit olması ve yalnızca Java nesneleri ile çalışabilmesi için Hibernate eşlemenizi özelleştirmeniz çok yararlı olabilir.

Bunu yapmanın en kolay yolu birden çok yapılandırma dosyasına sahip olmaktır. Örneğin, bunun gibi:

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>

Pekala, tüm Hazırda Bekletme başlatma kodu aslında sadece çoğaltılmıştır:

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

hafızadaki temel

Tamamen bellekte olan veritabanları olan DBMS vardır. Bu tür DBMS'ler genellikle basitçe kitaplıklar olarak dağıtılır ve tipik bir uygulamaya dahil edilmesi kolaydır. Bu tür DBMS, örneğin H2 veya Hsqldb'dir.

Maven'de bir bağımlılık kullanarak, diğer kitaplıklarla aynı şekilde projenize ekleyebilirsiniz:

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

Ve hemen ikinci bazın bir örneği:

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

Onlarla çalışmayı normal veritabanlarıyla aynı şekilde yapılandırabilirsiniz. Ancak kolaylık sağlamak için birkaç örnek verelim:

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>

İki yapılandırma arasındaki temel fark, Connection.url'dir:

H2 veritabanı
<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>