2013년 4월 9일 화요일

Hibernate에서 Tibero DB 사용하기

Hibernate에서 Tibero DB 사용하기

Hibernate에서 Tibero DB 사용하기

Tibero는 별도의 hibernate dialect을 지원하지 않는다. 대신 Tibero의 메타 데이터와 SQL 문법이 Oracle과의 호완성을 유지하기 때문에 Oracle diaclect을 사용할 수 있다. 그러나 몇가지 부분에서 Oracle 호완성이 유지 되지 않는 문제가 있다.

본 문서에서는 Hibernate에서 Tibero DB를 사용하기 위한 방안을 제시한다.

TiberoDialect 작성

DB 스키마를 자동으로 생성/업데이트를 할 때 Spring의 org.springframework.orm.hibernate3.LocalSessionFactoryBean 클래스에서는 createDatabaseSchema()updateDatabaseSchema() 메소드들을 사용한다. 이 메소드를 실행할 경우 Oracle dialect이 Tibero와 호완성이 맞지 않아 에러가 발생하게 된다.

다음과 같이 TiberoDialect을 작성하고 이를 사용한다.

import org.hibernate.dialect.Oracle9iDialect;

public class TiberoDialect extends Oracle9iDialect {
    @Override
    public String getQuerySequencesString() {
        return " select sequence_name from all_sequences";
    }
}

View metadata 요청 에러 workaround

class의 hibernate mapping을 table이 아닌 view로 할 경우 updateDatabaseSchema() 호출시 다음과 같은 에러가 발생하게 된다.

org.springframework.jdbc.UncategorizedSQLException: Hibernate operation: could not get table metadata: V_CLUSTER_PERFORMANCE; uncategorized SQLException for SQL [???]; SQL state [ERRPS]; error code [-20003];  'DCA'.'V_CLUSTER_PERFORMANCE' table does not exist..
TBR-15163: Unhandled exception at SYS.DBMS_STATS,  line 1755.   ; nested exception is com.tmax.tibero.jdbc.TbSQLException:  'DCA'.'V_CLUSTER_PERFORMANCE' table does not exist..

위 에러는 V_CLUSTER_PERFORMANCE라는 view의 table 메타 정보를 요청하면서 Tiber JDBC Driver에서 에러를 발생시켰다.

이 에러를 근본적으로 해결 하기 위해서는 Tibero JDBC를 수정하거나 org.hibernate.cfg.Configuration.generateSchemaUpdateScript() 메소드에서 TiberoDialect에 대한 예외 처리 코드를 추가해야 한다.

좀더 간단한 방법으로 updateDatabaseSchema()를 호출하기 전에 hibernate mapping 된 view를 drop한다. updateDatabaseSchema() 호출이 완료된 후 생성된 table을 drop하고 view를 생성 한다.

댓글 없음: