Paggawa gamit ang dalawang base sa parehong oras

Kadalasan mayroong mga sitwasyon kung kailan kailangan mong magtrabaho kasama ang dalawang base sa parehong oras. Halimbawa, binabasa mo ang data mula sa isang database, iproseso ito at isulat ito sa isa pa.

O mas karaniwan. Ang iyong application ay may isang lokal na database upang gumana, at maaari ring magbasa ng data mula sa iba't ibang malalayong mapagkukunan na sumusuporta sa format ng query ng data ng SQL. Halimbawa Excel.

Para sa mga malayuang pinagmumulan ng data na ito, maaari itong maging lubhang kapaki-pakinabang upang i-customize ang iyong Hibernate mapping upang ang lohika ng negosyo ng application ay maging mas simple at gumana lamang sa mga Java object.

Ang pinakamadaling paraan upang gawin ito ay ang pagkakaroon ng maraming configuration file. Halimbawa, tulad nito:

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>

Well, ang lahat ng Hibernate initialization code ay talagang nadoble lang:

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

base sa memorya

Mayroong DBMS, na mga database na ganap na nasa memorya. Ang mga naturang DBMS ay madalas na ipinamamahagi bilang mga aklatan at madaling isama sa isang karaniwang aplikasyon. Ang nasabing DBMS, halimbawa, ay H2 o Hsqldb.

Maaari mong idagdag ang mga ito sa iyong proyekto sa parehong paraan tulad ng anumang iba pang mga aklatan - gamit ang isang dependency sa Maven:

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

At kaagad isang halimbawa ng pangalawang base:

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

Maaari mong i-configure ang trabaho sa kanila sa parehong paraan tulad ng sa mga regular na database. Ngunit magbigay tayo ng ilang halimbawa para sa kaginhawahan:

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>

Ang pangunahing pagkakaiba sa pagitan ng dalawang configuration ay ang 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>