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를 생성 한다.
댓글 없음:
댓글 쓰기