동시에 두 개의 기지에서 작업
동시에 두 개의 기지로 작업해야 하는 상황이 종종 있습니다. 예를 들어, 한 데이터베이스에서 데이터를 읽고 처리하고 다른 데이터베이스에 씁니다.
또는 더 일반적입니다. 애플리케이션에는 작업할 하나의 로컬 데이터베이스가 있으며 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>
|
GO TO FULL VERSION