동시에 두 개의 기지에서 작업

동시에 두 개의 기지로 작업해야 하는 상황이 종종 있습니다. 예를 들어, 한 데이터베이스에서 데이터를 읽고 처리하고 다른 데이터베이스에 씁니다.

또는 더 일반적입니다. 애플리케이션에는 작업할 하나의 로컬 데이터베이스가 있으며 SQL 데이터 쿼리 형식을 지원하는 다양한 원격 소스에서 데이터를 읽을 수도 있습니다. 예를 들어 엑셀.

이러한 원격 데이터 소스의 경우 애플리케이션의 비즈니스 로직이 더 단순해지고 Java 객체에 대해서만 작동할 수 있도록 Hibernate 매핑을 사용자 정의하는 것이 매우 유용할 수 있습니다.

이를 수행하는 가장 쉬운 방법은 여러 구성 파일을 갖는 것입니다. 예를 들면 다음과 같습니다.

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>

음, 모든 Hibernate 초기화 코드는 실제로 복제됩니다.

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입니다.

Maven의 종속성을 사용하여 다른 라이브러리와 동일한 방식으로 프로젝트에 추가할 수 있습니다.

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>