एकाच वेळी दोन बेससह कार्य करणे

बर्‍याचदा अशी परिस्थिती असते जेव्हा आपल्याला एकाच वेळी दोन बेससह कार्य करण्याची आवश्यकता असते. उदाहरणार्थ, तुम्ही एका डेटाबेसमधील डेटा वाचता, त्यावर प्रक्रिया करता आणि दुसऱ्यावर लिहिता.

किंवा त्याहूनही सामान्य. तुमच्या ॲप्लिकेशनमध्ये काम करण्यासाठी एक स्थानिक डेटाबेस आहे आणि ते SQL डेटा क्वेरी फॉरमॅटला सपोर्ट करणार्‍या विविध रिमोट स्रोतांकडील डेटा देखील वाचू शकतात. उदाहरणार्थ एक्सेल.

या रिमोट डेटा स्रोतांसाठी, तुमचे हायबरनेट मॅपिंग सानुकूलित करणे खूप उपयुक्त ठरू शकते जेणेकरुन अनुप्रयोगाचे व्यवसाय लॉजिक सोपे होईल आणि फक्त Java ऑब्जेक्ट्ससह कार्य करू शकेल.

हे करण्याचा सर्वात सोपा मार्ग म्हणजे एकाधिक कॉन्फिगरेशन फाइल्स असणे. उदाहरणार्थ, यासारखे:

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>

बरं, सर्व हायबरनेट इनिशिएलायझेशन कोड प्रत्यक्षात फक्त डुप्लिकेट आहे:

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

स्मृती मध्ये आधार

तेथे डीबीएमएस आहेत, जे पूर्णपणे मेमरीमध्ये असलेले डेटाबेस आहेत. अशा DBMSs सहसा फक्त लायब्ररी म्हणून वितरीत केले जातात आणि सामान्य अनुप्रयोगामध्ये समाविष्ट करणे सोपे आहे. अशा DBMS, उदाहरणार्थ, H2 किंवा Hsqldb आहेत.

तुम्ही त्यांना तुमच्या प्रोजेक्टमध्ये इतर कोणत्याही लायब्ररीप्रमाणे जोडू शकता - मावेनमधील अवलंबित्व वापरून:

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

आणि लगेच दुसऱ्या बेसचे उदाहरण:

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>

दोन कॉन्फिगरेशनमधील महत्त्वाचा फरक म्हणजे 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>