Real Alternative DBMS ALTIBASE, Since 1999 Hibernate 연동가이드 2014.01 Copyright c 2000~2010 ALTIBASE Corporation. All Rights Reserved.
Document Control Change Record Date Author Change Reference 2010-11 snkim Created 2014-01 ChunKeun-Kim Modified Reviews Date Name (Position) Distribution Name Location Hibernate 연동가이드 2 page of 36
목차 개요... 4 HIBERNATE 개요... 5 Hibernate 란?... 5 Hibernate 다운로드... 5 HIBERNATE 를이용한 SAMPLE 작성... 7 hibernate-mapping 파일작성... 7 hibernate-configuration 파일작성... 8 Application 작성... 8 ALTIBASE 연동... 10 AltibaseDialect 클래스를 Hibernate jar 파일에포팅... 10 ALTIBASE JDBC Driver 얻는방법... 12 JDBC Driver 를설정하는방법... 13 hibernate-configuration 파일에 dialect 를설정하여 ALTIBASE 와연동... 14 FailOver 를이용한 Connection... 15 ALTIBASE5 와이전버전을동시에 Connection... 16 HIBERNATE, SPRING, ALTIBASE 연동... 18 Spring 에 datasource 를설정하는경우... 18 Hibernate 속성에 Connection 정보를설정하는경우... 19 ALTIBASE 의 ConnectionPool 을이용... 20 HIBERNATE 연동시고려사항... 22 Hibernate 에서트랜잭션관리... 22 LOB 데이터처리... 22 Procedure/Function 호출... 24 NativeSQL 실행... 25 paging 문제해결... 27 부록... 28 DB 테이블및시퀀스생성... 28 프로젝트생성... 28 hibernate-mapping 파일작성... 29 hibernate-configuration 파일작성... 30 Application 작성... 31 관련 jar 파일추가... 34 Application 실행... 35 Hibernate 연동가이드 3 page of 36
개요 본문서는 Hibernate 와 Hibernate+Spring 환경에서 ALTIBASE 와연동하는방법에대해기술한다. Hibernate 3.6.0, Spring Framework 2.5.6, ALTIBASE 는 5.3.3 버전, 개발 IDE 로는 Eclipse 를사용하였고, 문서이외에 ALTIBASE 를위한 Dialect 클래스인 AltibaseDialect 클래스및 chapter 별예제가별도로제공된다. 본문서와더불어개발시참고해야할문서들은다음과같다. 1. ALTIBASE 개발가이드 2. JAVA 개발가이드 3. ALTIBASE_JBOSS 연동가이드 4. ALTIBASE_TOMCAT 연동가이드 5. ALTIBASE_WEBSPHERE 연동가이드 6. ALTIBASE_WEBLOGIC 연동가이드 7. ALTIBASE_Spring 연동가이드 8. ALTIBASE_iBATIS 연동가이드 Hibernate 연동가이드 4 page of 36
Hibernate 개요 본장에서는 Hibernate 의개념과특징, 다운로드및사용방법에대해간단히살펴보도록한다. Hibernate 란? Hibernate 란프로그래머가 DB 를보다편리하게핸들링할수있게해주는 ORM(Object Relational Mapping) 프레임워크로서 DB 테이블과 Java 객체와의관계를 mapping 시켜 persistence logic 처리를도와주는역할을한다. 즉, Hibernate 를이용하면 DB 의테이블과 Java Persistence Object(JavaBean) 를 mapping(hibernate-mapping XML 파일 ) 시켜 DB 에 CRUD( 삽입, 조회, 수정, 삭제 ) 작업을쉽게할수있다. 다음은 Hibernate Architecture 를나타내는그림이다. Hibernate 의보다자세한아키텍처는다음의사이트를참고하면된다. http://www.hibernate.org 또는본기술문서와함께제공되는 hibernate-reference.pdf 문서를참고하기바란다. Hibernate 다운로드 Hibernate 를사용하기위해서 Hibernate 관련 jar 파일이필요하다. 이 jar 파일은 http://sourceforge.net/projects/hibernate 사이트에서다운로드받을수있다. 다운로드받은파일을압축풀면 lib 디렉토리의하위디렉토리안에여러가지 jar 파일들이존재하는데이 jar 파일들을이용하여 Hibernate 와연동하면된다. 본문서에서는 Hibernate 3.6.0 버전을사용하는데, 이버전의압축을푼디렉토리의이름은 hibernate-distribution-3.6.0.final 이다. Hibernate 연동가이드 5 page of 36
본문서의예제파일들을실행하기위해필요한 Hibernate 관련 jar 파일은다음과같다. jar 파일 위치 hibernate3.jar commons-collections-3.1.jar javassist-3.12.0.ga.jar dom4j-1.6.1.jar slf4j-api-1.6.1.jar jta-1.1.jar hibernate-jpa-2.0-api-1.0.1.final.jar hibernate-distribution-3.6.0.final hibernate-distribution-3.6.0.final\lib\required hibernate-distribution-3.6.0.final\lib\required hibernate-distribution-3.6.0.final\lib\required hibernate-distribution-3.6.0.final\lib\required hibernate-distribution-3.6.0.final\lib\required hibernate-distribution-3.6.0.final\lib\jpa 각예제에서는위의 jar 파일이외에추가해야하는파일들이있을수있는데해당 jar 파일은각 chapter 에기술된내용을참조하면된다. Hibernate 연동가이드 6 page of 36
Hibernate 를이용한 sample 작성 Hibernate 를이용하여 DB 와연동하기위해서는 hibernate-configuration XML 파일 (DB 와연동하기위한 Connection 정보및 dialect 를정의 ) 과 hibernate-mapping XML 파일 (Java Persistence Object 와 DB 테이블간의 mapping 을정의 ) 을작성해야한다. 본장에서는 hibernate-configuration XML 파일, hibernate-mapping XML 파일을작성하는방법과 Application 에서이파일을이용하여실제로 CRUD 작업을하는방법에대해설명한다. Sample 프로그램을작성하는보다자세한방법은부록부분을참고하면된다. hibernate-mapping 파일작성 hibernate-mapping XML 파일은 DB 테이블과 Java Object 사이의 mapping 정보를담고있는설정파일이다. 다음은 person 테이블과 Person class 간의 mapping 을정의한 hibernate-mapping XML 파일을작성한예제이다. (Person.hbm.xml) <?xml version="1.0" encoding="euc-kr"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="examples.domain.person" table="person"> <id name="id" column="id" type="int"> <generator class="sequence"> <param name="sequence">person_seq</param> </generator> </id> <property name="name" column="name" type="string"/> <property name="birthdate" column="birth_date" type="date"/> <property name="weightinkilograms" column="weight_kg" type="double"/> <property name="heightinmeters" column="height_m" type="double"/> <property name="ismarried" column="is_married" type="boolean"/> </class> </hibernate-mapping> <class> 태그를이용해 Java Class 와 DB 테이블, 그리고 <property> 태그에테이블의컬럼과이컬럼에대응하는 Java Variable 에대한 mapping 을지정한다. 각각의태그에대한보다자세한설명은사이트를참고하거나첨부된문서 hibernatereference.pdf 파일을참고하면된다. Hibernate 연동가이드 7 page of 36
hibernate-configuration 파일작성 hibernate-configure 파일은 DB 연결을위한 Dialect 클래스와여러가지 Connection 정보및 hibernate-mapping 파일들을설정하는파일이다. 다음은 hibernate-configuration 파일 (Hibernate.cfg.xml) 예제이다. <?xml version='1.0' encoding="euc-kr"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="connection.driver_class"> Altibase.jdbc.driver.AltibaseDriver</property> <property name="connection.url"> jdbc:altibase://192.168.1.35:21129/mydb</property> <property name="connection.username">sys</property> <property name="connection.password">manager</property> <property name="connection.pool_size">1</property> <property name="dialect"> org.hibernate.dialect.altibasedialect</property> <property name="current_session_context_class">thread</property> <property name="show_sql">true</property> <mapping resource="person.hbm.xml"/> </session-factory> </hibernate-configuration> <session-factory> 태그에 DB Connection 관련정보를설정하고 dialect 프로퍼티에연결하고자하는 DB 에알맞은 Dialect 클래스이름을명시해준다. 또한 <mappingresource> 태그를이용하여 hibernate-mapping 파일들을명시해준다. 각각의태그에대한보다자세한설명은 http://www.hibernate.org 사이트를참고하거나첨부된문서 hibernate-reference.pdf 파일을참고하면된다. Application 작성 Application 에서 Session 객체를이용하면 Mapping 된객체와연동하여 DB 테이블에 CRUD 작업을처리할수있는데방법은다음과같다. 1. hibernate-configuraion 파일을통해 SessionFactory 객체를얻어온다. 2. SessionFactory 객체를통해 Session 객체를얻어온다. 3. Session 객체의 CRUD 에해당하는메소드를호출한다. 다음은 DB 의 person 테이블에데이터를삽입, 변경, 삭제, 조회하는 Application 이다. 예 ) AltibaseConnection 의 PersonApp.java SessionFactory sessionfactory = Hibernate 연동가이드 8 page of 36
new Configuration().configure("Hibernate.cfg.xml").buildSessionFactory(); Session session = sessionfactory.opensession(); Transaction tx = session.begintransaction(); //insert Person Person newperson1 = new Person(); session.save(newperson1); tx.commit(); //select all Person Criteria crit = session.createcriteria(person.class); crit.addorder(order.asc("id")); List<Person> list = crit.list(); //update Person tx = session.begintransaction(); newperson1.setheightinmeters(1.93); newperson1.setweightinkilograms(86.36); session.update(newperson1); tx.commit(); //get Person Person person = (Person) session.get(person.class,newperson1.getid()); System.out.println(person); //delete Person tx = session.begintransaction(); session.delete(session.get(person.class, newperson1.getid())); tx.commit(); 먼저 hibernate-configuraion 파일을읽어들여 SessionFactory 객체를얻어온다. ( ) SessionFactory sessionfactory = new Configuration().configure("Hibernate.cfg.xml").buildSessionFactory(); 그리고 SessionFactory 객체를통해 Session 객체를얻어온다.( ) Session session = sessionfactory.opensession(); 이후 CRUD 에해당하는 Session 클래스의각각의메소드를호출한다. ( ) session.save(), session.update(), session.delete(), session.get(), session.createcriteria() 각각의태그에대한보다자세한설명은 http://www.hibernate.org 사이트를참고하거나첨부된문서 hibernate-reference.pdf 파일을참고하면된다. Hibernate 연동가이드 9 page of 36
ALTIBASE 연동 Hibernate 에서 ALTIBASE 를연동하는위해서는 ALTIBASE JDBC Driver 를 setting 하고 hibernate-configuration 파일에 ALTIBASE 를위한 dialect 를지정하면된다. 본장에서는 ALTIBASE 에 specific 한 AltibaseDialect class 를 Hibernate jar 파일에포함시키는방법과 ALTIBASE JDBC Driver 를얻는방법, JDBC Driver 를설정하는방법, hibernate-configuration 파일에 dialect 를설정하는방법에대해설명한다. 또한, FailOver 기능을사용하는방법, 여러버전의 ALTIBASE 와연동하는방법에대해서도살펴본다. AltibaseDialect 클래스를 Hibernate jar 파일에포팅 DBMS 벤더는제품의특성에맞는비표준 SQL 을제공할수있다. Hibernate 에서는비표준 SQL 문을수행할수있도록제공하는데이때사용하는클래스가 Dialect 클래스이다. 그러나 Hibernate 에는기본적으로 ALTIBASE 를위한 Dialect 클래스를제공하고있지않기때문에 ALTIBASE 용 Dialect 클래스를 Hibernate jar(ex.hibernate3.jar) 파일에포함해야 ALTIBASE 에서제공하는여러가지비표준 SQL(limit 절, sequence 구문등 ) 을사용할수있다. ALTIBASE 에서는 AltibaseDialect 클래스를정식으로제공하지않는다. 다만 sample 파일을제공하여개발시참고할수있도록한다. 이 sample 파일은이해를돕기위해제공하는것이며사용자환경에따른정상동작의여부및유지보수는보장하지않는다. sample 파일은본문서와함께첨부된 Example 디렉토리안에 AltibaseDialect.java 파일과 AltibaseDialect.class 파일을참고하면된다. AltibaseDialect.class 파일을다운로드받은 Hibernate jar 파일에포함시키는방법은다음과같다. 1. Hibernate jar 파일의압축을푼다. 2. AltibaseDialect.class 파일을다음의디렉토리에위치시킨다. Hibernate jar 의압축을푼디렉토리 \org\hibernate\dialect ex) C:\hibernate-distribution-3.6.0.Final\hibernate3\org\hibernate\dialect Hibernate 연동가이드 10 page of 36
3. Hibernate jar 의압축을푼디렉토리로이동한후 jar 명령어를이용하여 jar 파일로압축한다. Hibernate 연동가이드 11 page of 36
4. 이후생성된 hibernate3.jar 파일을 Hibernate jar 파일로사용한다. 본문서에서는 Hibernate 3.6.0 버전을사용했기때문에다른버전의 Hibernate jar 파일과 AltibaseDialect 클래스는호환이안될수있다. 함께첨부된 JARS/hibernate/hibernate3.jar 파일은 AltibaseDialect 클래스가포함된파일이다. ALTIBASE JDBC Driver 얻는방법 ALTIBASE 에서제공하는 JDBC driver 는 Altibase.jar 파일이다. 이파일은 ALTIBASE 가설치되어있는서버의 $ALTIBASE_HOME/lib 디렉토리안에존재한다. ALTIBASE 5 버전부터는 $ALTIBASE_HOME/lib 디렉토리에 Altibase.jar 파일과 Altibase5.jar 파일이존재하는데, Altibase.jar 는일반 JDBC Driver 파일이고, Altibase5.jar 는 ALTIBASE 5 버전과그이하의버전을함께연동하고싶을때사용하는 JDBC Driver 파일이다. 따라서하나의 ALTIBASE DB 와연동하거나, 또는버전이동일한여러대의 ALTIBASE 와연동할경우에는 $ALTIBASE_HOME/lib/Altibase.jar 파일을사용하면된다. 연동하려는 ALTIBASE DB Server 와 ALTIBASE JDBC Driver 가호환가능한지확인을위해 ALTIBASE JDBC Driver 버전확인이필요하다. ALTIBASE JDBC Driver 버전을확인하는방법은다음의명령어를수행하면된다. $ java jar Altibase.jar JDBC Driver Info : 13 2010 14:35:28 Altibase Ver = 5.3.3.13 for JavaVM v1.4, CMP:5.6.1, $Revision: 14502 $ Jan 이때, ALTIBASE DB Server 의 cm protocol version 과 ALTIBASE JDBC Driver 의 CMP 가동일하면호환가능하다. $ altibase -v version 5.3.3.13 XEON_LINUX_redhat_Enterprise_AS4-64bit-5.3.3.13-release-GCC3.4.6 (xeonredhat-linux-gnu) Jan 13 2010 14:35:30, binary db version 5.4.1, meta version 5.6.1, cm protocol version 5.6.1, replication protocol version 5.4.1 버전이 UP 되면서 JDBC 관련버그가 fix 되었을가능성이있으므로, 일반적으로 ALTIBASE DB Server 의버전과같거나혹은이보다더최신의 ALTIBASE JDBC Driver 파일을사용하는것을권장한다. Hibernate 연동가이드 12 page of 36
JDBC Driver 를설정하는방법 다운로드받은 JDBC Driver 인 Altibase.jar 파일을 classpath 에추가하거나웹서버의적절한디렉토리에위치시킨다. 만약, Eclipse 를사용하여개발한다면다음과같이해당프로젝트에 ALTIBASE JDBC Driver 를추가할수있다. 프로젝트 JRE System Library [J2SE-1.5] - Properties Installed JREs 항목중 jre 를클릭 Edit Add External JARs 를클릭하여 ALTIBASE JDBC Driver 인 Altibase.jar 를추가한다. Hibernate 연동가이드 13 page of 36
hibernate-configuration 파일에 dialect 를설정하여 ALTIBASE 와연동 hibernate-configuration 파일의 <sessionfactory> 의 <property> 태그를이용하여 ALTIBASE 연동을위한 Connection 관련정보와 dialect 클래스를지정한다. 이때, 정의된각각의 property 는다음의값을의미한다. Property connection.driver_class connection.url connection.username connection.password dialect 설명 ALTIBASE JDBC driver class Name Altibase.jdbc.driver.AltibaseDriver 를기입 ALTIBASE 와연결을위한 Connection string 정보 jdbc:altibase://ip:port_no/db_name 형태로기입 데이터베이스계정 데이터베이스패스워드 AltibaseDialect 클래스이름 org.hibernate.dialect.altibasedialect 를기입 다음은 hibernate-configuration 파일에서 ALTIBASE Connection 정보들을 setting 하는예제이다. 예 ) AltibaseConnection 의 Hibernate.cfg.xml 파일 <hibernate-configuration> <session-factory> <property name="connection.driver_class"> Altibase.jdbc.driver.AltibaseDriver</property> <property name="connection.url"> jdbc:altibase://192.168.1.35:21129/mydb</property> <property name="connection.username">sys</property> <property name="connection.password">manager</property> <property name="dialect"> org.hibernate.dialect.altibasedialect</property> <property name="connection.pool_size">1</property> <property name="current_session_context_class">thread</property> <property name="show_sql">true</property> <mapping resource="person.hbm.xml"/> </session-factory> </hibernate-configuration> ALTIBASE 와연결하기위해 connection.driver_class, connection.url, connection.username, connection.password 를설정하고있다. 또한 dialect 프로퍼티에 AltibaseDialect 클래스를지정하고, hibernate-mapping 파일인 Person.hbm.xml 파일을 setting 하고있다. 위의 AltibaseConnection 프로젝트를실행하기 Hibernate 관련 jar 파일들과 Altibase.jar 파일이필요하다. Hibernate 연동가이드 14 page of 36
FailOver 를이용한 Connection ALTIBASE 5.3.3 부터 FailOver 를지원하는데, FailOver 기능을사용하기위해서는 hibernate-configuration 파일의 connection.url 프로퍼티에 FailOver 관련속성을넣어주면된다. 다음은 FailOver 를이용하여 ALTIBASE 에연결하는예제이다. 예 ) FailoverSample 의 Hibernate.cfg.xml 파일 <property name="connection.url">jdbc:altibase://192.168.1.35:21129/mydb?alternateservers=(1 27.0.0.1:20300)&ConnectionRetryCount=1&ConnectionRetryDelay=1&S essionfailover=on&loadbalance=off </property> 위의파일에지정한 Connection url 부분에정의하는 FailOver 관련 property 는다음과같다. Property AlternateServer ConnectionRetryCount ConnectionRetryDelay LoadBalance 설명 장애발생시접속하게될가용서버를나타내며 (IP Address1:Port1, IP Address2:Port2,...) 형식으로기술한다. 가용서버접속실패시, 접속시도반복횟수 가용서버접속실패시, 다시접속을시도하기전에대기하는시간 ( 초단위 ) on 으로설정하면최초접속시도시에기본서버와가용서버를포함하여랜덤으로선택한다. off 로설정하면최초접속시도시에기본서버에접속하고, 접속에실패하면 AlternateServer 로기술한서버에접속한다. SessionFailOver STF(Service Time Fail-Over) 를할것인지여부를나타낸다. on : STF, off : CTF Hibernate 연동가이드 15 page of 36
Property 설명 CTF(Connection Time Fail-Over) 는 DBMS 접속시점에장애를인식하여장애가발생한 DBMS 대신다른가용 STF(Service Time Fail-Over) 는 DBMS 접속에성공하여노드의 DBMS 로접속하고서비스를진행한다. 서비스하는도중에장애가발생하는것으로, 다른가용노드의 DBMS 에다시접속하여세션의프로퍼티를복구한후사용자응용프로그램의업무로직을다시수행하도록하는것을의미한다. 즉장애가발생한 DBMS 에서수행된작업을다시한번수행할필요가있는경우이다. 위의 FailoverSample 프로젝트를실행하기위해서는 hibernate-configuration 파일에 dialect 를설정하여 ALTIBASE 와연동 부분과동일한 jar 파일들이필요하다. ALTIBASE5 와이전버전을동시에 Connection ALTIBASE 5 부터는하나의어플리케이션에서 ALTIBASE 5 와 ALTIBASE 4 혹은 ALTIBASE 3 와동시에연결할수있도록 ALTIBASE 5 버전전용의 JDBC Driver(Altibase5.jar) 를제공한다. 이 Driver 를이용하면 ALTIBASE 5 ALTIBASE 4, 혹은 ALTIBASE 5 ALTIBASE 3, ALTIBASE 5.1.5 ALTIBASE 5.3.3 간두버전의 ALTIBASE 에접속이가능하다. 기존의 Altibase.jar 와구별하기위해별도로 ALTIBASE 5 전용의 Altibase5.jar 가필요하다. 또한 hibernate-configuration 파일의 connection.driver_class 프로퍼티에지정하는 JDBC Driver 클래스이름도기존의 Altibase.jdbc.driver.AltibaseDriver 대신 ALTIBASE 5 전용의 Altibase5.jdbc.driver.AltibaseDriver 를지정해야한다. Hibernate 에서다른버전의 ALTIBASE 와연동하기위해서는각버전에해당하는 hibernate-configuration 파일을별도로작성하여 Application 에서각각의 hibernateconfiguration 파일을읽어오면된다. 이때주의할점은 Application 에서 Altibase5.jdbc.driver.AltibaseDriver 를먼저로딩한후에 Altibase.jdbc.driver.AltibaseDriver 를로딩해야한다는것이다. 다음은 Altibase.jar 와 Altibase5.jar 파일을이용하여두버전의 ALTIBASE 의드라이버를로딩하는예제이다. 예 ) MultiVersionConnection 의 Hibernate.Altibase5.cfg.xml 파일 ALTIBASE 5 버전에대한설정 <property name="connection.driver_class">altibase5.jdbc.driver.altibasedriver </property> 예 ) MultiVersionConnection 의 Hibernate.Altibase4.cfg.xml 파일 ALTIBASE 5 이전버전에대한설정 Hibernate 연동가이드 16 page of 36
<property name="connection.driver_class">altibase.jdbc.driver.altibasedriver </property> 예 ) MultiVersionConnection 의 PersonApp.java 파일 SessionFactory sessionfactory1 = new Configuration().configure("Hibernate.Altibase5.cfg.xml").buildSessionFactory(); SessionFactory sessionfactory2 = new Configuration().configure("Hibernate.Altibase4.cfg.xml").buildSessionFactory(); Session session1 = sessionfactory1.opensession(); Session session2 = sessionfactory2.opensession(); 위의 PersonApp.java 예제를보면 Altibase5.jdbc.driver.AltibaseDriver 를 Altibase.jdbc.driver.AltibaseDriver 보다먼저로딩하기위해 Altibase5.jdbc.driver.AltibaseDriver 를 connection.driver_class 로사용하는 Hibernate.Altibase5.cfg.xml 파일을먼저읽어오고있다. 반드시 ALTIBASE5 전용의드라이버를먼저로딩해야한다는것에유의해야한다. 예제에포함된 MultiVersionConnection 프로젝트를실행하기위해서는기존에사용했던 jar 파일뿐만아니라, Altibase5.jar 파일이더필요하다. 이파일들은 ALTIBASE 가설치된디렉토리 ($ALTIBASE_HOME) 의 lib 디렉토리안에존재하는데 ALTIBASE 5 버전의 Altibase5.jar 파일, 그이전버전의 Altibase.jar 파일을사용하면된다. Hibernate 연동가이드 17 page of 36
Hibernate, Spring, ALTIBASE 연동 ALTIBASE 와연동하기위해서는 Hibernate 의 property 로 Connection 정보와 dialect 를지정해서연결할수도있고, Spring 에 datasource 를지정해서연결할수도있다. 본장에서는이두방법을이용하여 ATLIBASE 와연동하는방법에대해설명한다. Spring 에 datasource 를설정하는경우 Hibernate 와 Spring 을함께사용하기위해서는다음의과정이필요하다. 1. Spring 의 applicationcontext.xml 파일에 DB 연동을위한 datasource 를작성한다. datasource 를설정하는방법은 ALTIBASE_Spring_ 연동가이드 문서를참고하면된다. 2. applicationcontext.xml 파일에 Hibernate 의 sessionfactory bean 을지정해준다. 이때 <property name="datasource"> 에 1 번에서설정한 datasource 를지정하고, < property name="mapping-resource > 에 hibernate-mapping 파일들을지정한다. 그리고 <property name="hibernate Properties > 를이용해 Hibernate 에관한여러가지속성들을정의한다. 3. applicationcontext.xml 파일에서각각의 DAO bean 에 SessionFactory bean 을참조하도록설정해준다. 4. DAO 클래스에서설정한 SessionFactory 객체를통해 Session 객체를얻어와 CRUD 에해당하는메소드들을호출한다. 다음은 applicationcontext.xml 파일에서 datasource 와 sessionfactory bean 을지정해주는예제이다. 예 ) SpringAltibaseConnection1 의 applicationcontext.xml 파일 <bean id="datasource" class="org.springframework.jdbc.datasource.drivermanagerdatasource"> <property name="driverclassname" value="altibase.jdbc.driver.altibasedriver"/> <property name="url" value="jdbc:altibase://192.168.1.35:21129/mydb"/> <property name="username" value="sys"/> <property name="password" value="manager" /> </bean> <bean id="sessionfactory" class="org.springframework.orm.hibernate3.localsessionfactorybean"> <property name="datasource" ref="datasource"/> <property name="mappingresources"> <list> <value>person.hbm.xml</value> </list> </property> <property name="hibernateproperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.altibasedialect</prop> </props> </property> Hibernate 연동가이드 18 page of 36
</bean> <bean id="persondao" class="examples.domain.persondao" > <constructor-arg ref="sessionfactory" /> </bean> 위의예제 SpringAltibaseConnection1 프로젝트를실행하기위해서는 hibernateconfiguration 파일에 dialect 를설정하여 ALTIBASE 와연동 부분에서필요했던 jar 파일들뿐만아니라 spring 관련된 jar 파일이더필요하다. jar 파일의자세한디렉토리위치는 ALTIBASE_Spring_ 연동가이드 문서를참고하면된다. Hibernate 속성에 Connection 정보를설정하는경우 Hibernate+Spring 환경에서 Hibernate 에 Connection 속성을지정하여연결할경우에는다음의과정이필요하다. 1. applicationcontext.xml 파일에 Hibernate 의 SessionFactory bean 을지정해준다. < property name="mapping-resource > 에 hibernate-mapping 파일들을지정한다. 그리고 <property name="hibernate Properties > 태그안에 Connection 관련정보및 dialect 클래스를정의한다. 2. 각각의 DAO bean 에 sessionfactory bean 을참조하도록설정해준다. 3. DAO 클래스에서설정한 SessionFactory 객체를통해 Session 객체를얻어와 CRUD 에해당하는메소드들을호출한다. 다음은 Hibernate 에 Connection 속성을설정하여 ALTIBASE 와연동하는예제이다. 예 ) SpringAltibaseConnection2 의 applicationcontext.xml 파일 Hibernate 연동가이드 19 page of 36
<bean id="sessionfactory" class="org.springframework.orm.hibernate3.localsessionfactorybean"> <property name="mappingresources"> <list> <value>person.hbm.xml</value> </list> </property> <property name="hibernateproperties"> <props> <prop key="hibernate.dialect"> org.hibernate.dialect.altibasedialect</prop> <prop key="hibernate.connection.driver_class"> Altibase.jdbc.driver.AltibaseDriver</prop> <prop key="hibernate.connection.url"> jdbc:altibase://192.168.1.35:21129/mydb</prop> <prop key="hibernate.connection.username">sys</prop> <prop key="hibernate.connection.password">manager</prop> <prop key="hibernate.connection.pool_size">1</prop> <prop key="hibernate.current_session_context_class">thread</prop> <prop key="hibernate.show_sql">true</prop> </props> </property> </bean> <bean id="persondao" class="examples.domain.persondao" > <constructor-arg ref="sessionfactory" /> </bean> SpringAltibaseConnection2 예제를실행하기위해서는 Spring 에 datasource 를설정하는경우 부분과같은 jar 파일들이필요하다. ALTIBASE 의 ConnectionPool 을이용 ALTIBASE 에서제공하는 ABConnectionPoolDataSource 클래스를사용하면 ALTIBASE 의 ConnectionPool 을이용할수있다. 만약, Hibernate + Spring 연동환경이라면 Spring 의 applicationcontext.xml 파일에 ABConnectionPoolDataSource 클래스를이용하여 datasource bean 을정의하면된다. 하지만, Spring 과연동없이 Hibernate 만사용한다면 ALTIBASE 의 ConnectionPool 을사용할수없다. ALTIBASE 의 ConnectionPool 을이용하는자세한내용은 ALTIBASE_Spring_ 연동가이드 문서를참고하여설정하면된다. 예 ) AltibaseConnectionPool 의 applicationcontext.xml 파일 <bean id="datasource" class="altibase.jdbc.driver.abconnectionpooldatasource"> Hibernate 연동가이드 20 page of 36
<property name="url" value="jdbc:altibase://192.168.1.35:21129/mydb"/> <property name="user" value="sys"/> <property name="password" value="manager" /> </bean> AltibaseConnectionPool 예제를실행하기위해서는 Spring 에 datasource 를설정하는경우 부분과같은 jar 파일들이필요하다. Hibernate 연동가이드 21 page of 36
Hibernate 연동시고려사항 Hibernate 에서 ALTIBASE 와연동할경우고려해야할사항에대해설명한다. Hibernate 에서트랜잭션관리 Hibernate 에서트랜잭션을처리할때는 Application 에서 Session 클래스의 begintransaction() 메소드를호출한후 Transaction 클래스의 commit() / rollback() 메소드를호출하면된다. begintransaction() 메소드를호출할때자동으로 setautocommit(false) 가호출되어트랜잭션이유지되고, 이후 commit() / rollback() 메소드를호출하면해당트랜잭션이종료된다. 예 ) AltibaseConnection 의 PersonApp.java 파일 Transaction tx = session.begintransaction(); //insert Person Person newperson1 = new Person(); session.save(newperson1); tx.commit(); //update Person tx = session.begintransaction(); newperson1.setheightinmeters(1.93); newperson1.setweightinkilograms(86.36); session.flush(); tx.commit(); //delete Person tx = session.begintransaction(); session.delete(session.get(person.class, newperson1.getid())); tx.commit(); LOB 데이터처리 Hibernate 에서 LOB 을처리하기위해서는 hibernate-mapping 파일에컬럼과변수의 mapping 을정의한 <property> 태그에 CLOB 일경우에는 type= org.hibernate.type.stringclobtype, sql-type= clob 으로정의해주고 BLOB 일경우에는 type= org.hibernate.type. PrimitiveByteArrayBlobType, sql-type= blob 으로정의해줘야한다. 그렇지않을경우에길이제한에의해올바르지않은데이터를입력하거나잘못된데이터를질의할수있다. 또는 Invalid length 등의에러가발생할수도있다. 다음은 CLOB 과 BLOB 타입의데이터에대한 <property> 를 setting 하는예제이다. Hibernate 연동가이드 22 page of 36
예 ) LobSample 의 LobSample.hbm.xml(hibernate-mapping) 파일 <hibernate-mapping> <class name="com.altibase.lob.lobsample" table="lobsample"> <id name="lob_id" column="lob_id" type="int"> <generator class="assigned"/> </id> <property name="clobcolumn" type="org.hibernate.type.stringclobtype"> <column name="clobcolumn" sql-type="clob"/> </property> <property name="blobcolumn" type="org.hibernate.type.primitivebytearrayblobtype"> <column name="blobcolumn" sql-type="blob"/> </property> </class> </hibernate-mapping> 뿐만아니라, LOB 처리시반드시주의해야할또다른사항은 ALTIBASE 에서 LOB 데이터를처리하기위해서는반드시 autocommit 모드를 false 로바꾼후트랜잭션을관리해줘야한다는것이다. Hibernate 연동시 Session 의 begintransaction() 메소드를호출하면자동으로 setautocommit(false) 를해주기때문에 LOB 을처리하기전 begintransaction() 메소드를호출하면된다. Hibernate 와 Spring 을함께연동할경우 Spring 에서트랜잭션을관리해주더라도 aucocommit 을 false 가적용되지않을수있으므로반드시 Java Application 에서 begintransaction() 메소드를호출하는방법을권장한다. 만약 begintransaction() 메소드를호출하지않았다면다음과같은에러및현상이발생할수있다. 1. LOB 데이터조회시 null 값이리턴되거나, java.sql.sqlexception: [0]:LobLocator can not span the transaction 101858625. 과같은에러가발생 2. LOB 데이터입력시 java.sql.sqlexception: [0]: Connection is in autocommit mode. One can not operate on LOB datas with autocommit mode on. 에러가발생 다음의예제는 Hibernate 에서 LOB 을처리하는예제이다. 예 ) LobSample 의 LobApp.java 파일 Transaction tx = session.begintransaction(); StringBuffer msg=new StringBuffer("Existing Disk-based RDBMS (also known as Disk-Resident DBMSs or DRDBMSs" ); for(int i=0; i<10;i++){ msg.append(msg.tostring()); Lobsample lob1 = new Lobsample(1,msg.toString(),msg.toString().getBytes()); session.save(lob1); tx.commit(); session.flush(); tx = session.begintransaction(); Hibernate 연동가이드 23 page of 36
Lobsample Lobsample1 = (Lobsample) session.get(lobsample.class,lob1.getlob_id()); System.out.println(Lobsample1.getClobcolumn().substring(0, 100)); System.out.println(Lobsample1.getBlobcolumn()); tx.commit(); 위의 LobSample 프로젝트를실행하기위해서는 hibernate-mapping 파일에 dialect 를설정하여 ALTIBASE 와연동 부분과같은 jar 파일들이필요하다. Procedure/Function 호출 Hibernate 에서 DB 에생성한 Stored Procedure/Function 을호출은지원하지않기때문에 Session 객체를통해 Connection 객체를얻어와서일반 JDBC 에서호출하는방법처럼 CallableStatement 를이용해야한다. 다음은 Stored Procedure/Function 을호출하는예제이다. 예 ) ProcedureSample 의 Procedure/Function 생성구문 CREATE OR REPLACE PROCEDURE sum_proc ( p_num1 IN NUMBER, p_num2 IN NUMBER, p_num3 OUT NUMBER ) AS BEGIN p_num3 := p_num1 + p_num2; END; / CREATE OR REPLACE FUNCTION sum_func ( p_num1 IN NUMBER, p_num2 IN NUMBER ) RETURN NUMBER AS v_num NUMBER; BEGIN v_num := p_num1 + p_num2; RETURN v_num; END; / 예 ) ProcedureSample 의 ProcedureApp.java SessionFactory sessionfactory = new Configuration().configure().buildSessionFactory(); Session session = sessionfactory.opensession(); Hibernate 연동가이드 24 page of 36
Connection con =session.connection(); // Stored Procedure 호출 String sql1 = "{call sum_proc(?,?,?)"; CallableStatement altibasestatement1 = con.preparecall(sql1); altibasestatement1.setint(1,10); altibasestatement1.setint(2,20); altibasestatement1.registeroutparameter(3,java.sql.types.numeric); altibasestatement1.execute(); System.out.println(altibaseStatement1.getDouble(3)); // Stored Function 호출 String sql2 = "{call? := sum_func(?,?)"; CallableStatement altibasestatement2 = con.preparecall(sql2); altibasestatement2.registeroutparameter(1,java.sql.types.numeric); altibasestatement2.setint(2,10); altibasestatement2.setint(3,20); altibasestatement2.execute(); System.out.println(altibaseStatement2.getDouble(1)); ProcedureSample 예제를실행하기위해서는 hibername-mapping 파일에 dialect 를설정하여 ALTIBASE 와연동 과같은 jar 파일들이필요하다. NativeSQL 실행 SQL 문중 MOVE 구문은 ALTIBASE 에서만제공하는문장이다. 이렇게특정 DBMS 가제공하는 DBMS specific 한내용들을실행하는방법은다음과같다. 1. hibernate-mapping 파일에 nativesql 구문을작성한다. 2. Application 에서 session 객체의 getnamedquery() 메소드를호출하여 Query 객체를얻어온다. 3. Query 객체의각각의 SQL 문을실행하는메소드를호출한다 (ex. executeupdate(), list() 등 ) 다음은 MOVE 문을실행하는예제이다. 예 ) NativeSQL 의 NativeSQL.hbm.xml 파일 <hibernate-mapping> <sql-query name="nativesqlmove"> <![CDATA[ MOVE INTO t2 (c1,c2,c3) FROM t1(c1,c2,c3) ]]> </sql-query> </hibernate-mapping> Hibernate 연동가이드 25 page of 36
예 ) NativeSQL 의 NativeSQLApp.java SessionFactory sessionfactory = new Configuration().configure("Hibernate.cfg.xml").buildSessionFactory(); Session session = sessionfactory.opensession(); Query query = session.getnamedquery("nativesqlmove"); Transaction tx = session.begintransaction(); int rows = query.executeupdate(); tx.commit(); System.out.println(rows+" data moved"); NativeSQL 예제를실행하기위해서는 hibername-mapping 파일에 dialect 를설정하여 ALTIBASE 와연동 부분과같은 jar 파일들이필요하다. Hibernate 연동가이드 26 page of 36
paging 문제해결 hibernate ALTIBASE 게시판구성에서페이징처리시마지막페이지가제대로보이지않는다면다음과같이조치한다. AltibaseDialect.java 파일... /* */... public boolean bindlimitparametersinreverseorder() { return false; 해당메소드주석처리후본문 AltibaseDialect 클래스를 Hibernate jar 파일에포팅부분을참고한다. 포함된 sample 소스인 Example.zip 은해당부분이수정된 jar 파일을포함하고있다. Hibernate 연동가이드 27 page of 36
부록 AltibaseConnection 예제를바탕으로 Hibernate 에서 ALTIBASE 와연동하는방법에대해좀더자세하게설명한다. 단, IDE 는 Eclipse 를사용한다. DB 테이블및시퀀스생성 DB 에다음의테이블과시퀀스를생성한다. (create_tbl.sql 파일참고 ) CREATE TABLE PERSON( ID NUMBER (5, 0) NOT NULL, NAME VARCHAR (40) NOT NULL, BIRTH_DATE DATE, WEIGHT_KG NUMBER (4, 2) NOT NULL, HEIGHT_M NUMBER (4, 2) NOT NULL, IS_MARRIED CHAR(1), PRIMARY KEY (ID) ); CREATE SEQUENCE PERSON_SEQ; 프로젝트생성 Eclipse에서 AltibaseConnection 이라는프로젝트를생성한다. 1. 메뉴 File New - Java Project 클릭 2. Project name : 에 AltibaseConnection 입력 3. Finish 버튼을클릭 Hibernate 연동가이드 28 page of 36
hibernate-mapping 파일작성 DB 의 person 테이블과 Person class(java object) 사이의 mapping 정보를정의한 hibernate-mapping 파일을작성한다. (Person.hbm.xml) 1. AltibaseConnection 프로젝트 src 디렉토리에서마우스오른쪽버튼클릭하여 New File 을클릭한다. 2. File name: 에 Person.hbm.xml 을작성한다. Hibernate 연동가이드 29 page of 36
다음의내용을 Person.hbm.xml 파일에작성한다. <?xml version="1.0" encoding="euc-kr"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="examples.domain.person" table="person"> <id name="id" column="id" type="int"> <generator class="sequence"> <param name="sequence">person_seq</param> </generator> </id> <property name="name" column="name" type="string"/> <property name="birthdate" column="birth_date" type="date"/> <property name="weightinkilograms" column="weight_kg" type="double"/> <property name="heightinmeters" column="height_m" type="double"/> <property name="ismarried" column="is_married" type="boolean"/> </class> </hibernate-mapping> person 테이블의컬럼과 Person class 의변수를 <property> 태그를통해각각 mapping 해준다. 이때 Java 의 boolean 타입은 DB 에서지원하는타입이아니므로 0(false), 1(true) 의값으로저장하도록컬럼을 CHAR(1) 의타입으로생성하였다. hibernate-configuration 파일작성 1. ALTIBASE 연결을위한 dialect 를정의하는 hibernate-configuration 파일을작성한다. (AltibaseConnection 프로젝트 src 디렉토리에서마우스오른쪽버튼클릭하여 New File 을클릭한다. File name: 에 Hibernate.cfg.xml 을작성한다.) <?xml version='1.0' encoding="euc-kr"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="connection.driver_class"> Altibase.jdbc.driver.AltibaseDriver</property> <property name="connection.url"> jdbc:altibase://192.168.1.35:21129/mydb</property> <property name="connection.username">sys</property> <property name="connection.password">manager</property> <property name="connection.pool_size">1</property> <property name="dialect"> org.hibernate.dialect.altibasedialect</property> <property name="current_session_context_class">thread</property> <property name="show_sql">true</property> <mapping resource="person.hbm.xml"/> Hibernate 연동가이드 30 page of 36
</session-factory> </hibernate-configuration> Application 작성 1. person 테이블에대한 DO 객체인 Person 클래스 (Person.java) 를작성한다. 1-1. AltibaseConnection 프로젝트의 src 디렉토리에서마우스오른쪽버튼클릭하여 New Class 를클릭한다. 1-2. Package: 에 examples.domain 를입력하고 Name: 에 Person 를입력한다. 다음의내용을 Person.java 파일에작성한다. package examples.domain; import java.sql.*; public class Person { private int id; private String name; private Date birthdate; private double weightinkilograms; private double heightinmeters; private boolean ismarried; public int getid () { return id; public void setid (int id) { this.id = id; public void setname(string name) { Hibernate 연동가이드 31 page of 36
this.name = name; public String getname() { return name; public void setbirthdate(date birthdate) { this.birthdate = birthdate; public Date getbirthdate() { return birthdate; public void setweightinkilograms(double weightinkilograms) { this.weightinkilograms = weightinkilograms; public void setismarried(boolean ismarried) { this.ismarried = ismarried; public double getweightinkilograms() { return weightinkilograms; public void setheightinmeters(double heightinmeters) { this.heightinmeters = heightinmeters; public double getheightinmeters() { return heightinmeters; public boolean getismarried() { return ismarried; public String tostring(){ return "id="+id+", name="+name+", birthdata="+birthdate+", weightinkillograms=" +weightinkilograms+",heightinmeters="+heightinmeters+",ismarried="+i smarried; 2. DB 에 CRUD 를실행하는 main 프로그램 (PersonApp.java) 을작성한다. 2-1. AltibaseConnection 프로젝트의 src 디렉토리에서마우스오른쪽버튼클릭하여 New Class 를클릭한다. 2-2. Name: 에 PersonApp 를입력한다. Hibernate 연동가이드 32 page of 36
다음의내용을 PersonApp.java 파일에작성한다. import java.sql.sqlexception; import java.util.*; import org.hibernate.sessionfactory; import org.hibernate.session; import org.hibernate.transaction; import org.hibernate.cfg.configuration; import org.hibernate.criteria; import org.hibernate.criterion.order; import examples.domain.person; public class PersonApp { public static void main(string[] args) throws SQLException { SessionFactory sessionfactory = new Configuration().configure().buildSessionFactory(); Session session = sessionfactory.opensession(); Transaction tx = session.begintransaction(); //insert Person System.out.println("insert Person"); Person newperson1 = new Person(); newperson1.setname("kim"); newperson1.setbirthdate (new java.sql.date(1978,1-1,1)); newperson1.setheightinmeters(1.82); newperson1.setweightinkilograms(80.23); newperson1.setismarried(true); session.save(newperson1); Person newperson2 = new Person(); newperson2.setname("lee"); newperson2.setbirthdate (new java.sql.date(1975,5-1,5)); newperson2.setheightinmeters(1.57); newperson2.setweightinkilograms(45.23); newperson2.setismarried(false); session.save(newperson2); Hibernate 연동가이드 33 page of 36
tx.commit(); System.out.println(); System.out.println("select all Persons"); Criteria crit = session.createcriteria(person.class); crit.addorder(order.asc("id")); List<Person> list = crit.list(); System.out.println("Selected "+list.size()+" records."); for(int i=0; i< list.size();i++){ System.out.println(list.get(i)); tx = session.begintransaction(); //update Person //Session 범위내에서변경된객체값은자동으로 DB 에반영 System.out.println(); System.out.println("update Person"); newperson1.setheightinmeters(1.93); newperson1.setweightinkilograms(86.36); System.out.println(); tx.commit(); Person person = (Person) session.get(person.class,newperson1.getid()); System.out.println(person); //delete Person tx = session.begintransaction(); System.out.println(); System.out.println("delete Person"); session.delete(session.get(person.class, newperson1.getid())); //session.delete(session.get(person.class, newperson2.getid())); tx.commit(); crit = session.createcriteria(person.class); crit.addorder(order.asc("id")); list = crit.list(); System.out.println("Selected "+list.size()+" records."); for(int i=0; i< list.size();i++){ System.out.println(list.get(i)); 관련 jar 파일추가 Altibase.jar 와 hibernate 관련 jar 파일을추가한다. AltibaseConnection 프로젝트에서마우스오른쪽버튼클릭하여 Properties 를클릭 Java Build Path Libraries 에서 Add External JARS 를클릭하여필요한 jar 파일들을추가한다. Hibernate 연동가이드 34 page of 36
Application 실행 AltibaseConnection 프로젝트를실행한다. AltibaseConnection 프로젝트를클릭한후메뉴에서 Run 을실행하거나 Run 실행단추를클릭한다. Hibernate 연동가이드 35 page of 36
알티베이스 서울특별시구로구구로 3 동 182-13 대륭포스트 2 차 1008 호 02-2082-1000 http://www.altibase.com 대전사무소대전광역시서구둔산동 921 주은리더스텔 901 호 042-489-0330 기술지원센터 02-2082-1114 support@altibase.com ATC (ALTIBASE Technical Center) http://atc.altibase.com Copyright c 2000~2010 ALTIBASE Corporation. All Rights Reserved. 이문서는정보제공을목적으로제공되며, 사전에예고없이변경될수있습니다. 이문서는오류가있을수있으며, 상업적또는특정목적에부합하는명시적, 묵시적인책임이일체없습니다. 이문서에포함된 ALTIBASE 제품의특징이나기능의개발, 발표등의시기는 ALTIBASE 재량입니다. ALTIBASE는이문서에대하여관련된특허권, 상표권, 저작권또는기타지적재산권을보유할수있습니다. Hibernate 연동가이드 36 page of 36