एक ही समय में दो ठिकानों के साथ काम करना

अक्सर ऐसे हालात होते हैं जब आपको एक ही समय में दो आधारों के साथ काम करने की आवश्यकता होती है। उदाहरण के लिए, आप एक डेटाबेस से डेटा पढ़ते हैं, उसे प्रोसेस करते हैं और दूसरे को लिखते हैं।

या और भी सामान्य। आपके एप्लिकेशन के पास काम करने के लिए एक स्थानीय डेटाबेस है, और SQL डेटा क्वेरी प्रारूप का समर्थन करने वाले विभिन्न दूरस्थ स्रोतों से डेटा भी पढ़ सकता है। उदाहरण के लिए एक्सेल।

इन दूरस्थ डेटा स्रोतों के लिए, अपने हाइबरनेट मैपिंग को अनुकूलित करना बहुत उपयोगी हो सकता है ताकि एप्लिकेशन का व्यावसायिक तर्क सरल हो और केवल जावा ऑब्जेक्ट्स के साथ काम कर सके।

ऐसा करने का सबसे आसान तरीका एकाधिक कॉन्फ़िगरेशन फ़ाइलें रखना है। उदाहरण के लिए, इस तरह:

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

स्मृति में आधार

DBMS हैं, जो डेटाबेस हैं जो पूरी तरह से मेमोरी में हैं। ऐसे DBMS को अक्सर पुस्तकालयों के रूप में वितरित किया जाता है और एक विशिष्ट अनुप्रयोग में शामिल करना आसान होता है। ऐसे 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>

दो कॉन्फ़िगरेशन के बीच मुख्य अंतर कनेक्शन.यूआरएल है:

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>