JJC's 테크니컬 다이어리

하이버네이트 기본 본문

Hibernate

하이버네이트 기본

털털한JJC 2009. 9. 19. 08:45

다이얼렉트(dialect:)
Hibernate 지원되는 다양한 디비용 dialect 클래스를 제공한다. 이는 사용되는 db제품에 정확하고 최적화된 SQL 를 보장하기 위함이다. 예: HSQLDB => org.hibernate.dialect.HSQLDialect

SessionFactory, Session, Transaction
SessionFactory 는 Session 오브젝트의 집합을 관리해 준다. 각 SessionFactory 는 단일 DB로 대응된다. Session 오브젝트는 JDBC 컨넥션의 래퍼(warpper)임과 동시에 Transaction 오브젝트의 factory 다.

내장된 컨넥션 풀링
Hibernate 사용의 중요한 혜택으로 내장된 DB컨넥션 풀링의 제공이다. 우리의 걱정을 한가지 줄여주는 것이다. 알다시피 컨넥션 풀링은 오픈된 DB컨넥션의 특정한 풀을 만드는데 사용된다(hibernate.cfg.xml 의 connection.pool_size property). 컨넥션 풀을 사용함으로 DB사용이 더욱 효율적으로 이루어 진다. 기존 오픈된 컨넥션을 재사용하기 때문이다. 더욱이 오픈된 컨넥션을 재사용함으로써 성능향상도 얻게된다. DB 컨넥션을 열고 닫는데 지연을 없애기 때문이다.

데이타베이스 레코드에 대한 작업(Java Objects 처럼)

Hibernate의 org.hibernate.Session 인터페이스에서 사용가능한 몇가지 메소드로 DB 레코드를 오브젝트처럼 다룰 수 있다. 가장 부각되는 메소드는 save, load, get, update, merge, saveOrUpdate, delete, createQuery 이다.
또 하나의 언급할만한 인터페이스는 org.hibernate.Query 인데 Session.createQuery Hibernate 메소드 호출의 반환 형식이다. Query 클래스는 java.util. Collection 오브젝트형식으로 레코드 그룹을 받아오는데 사용할 수 있다(Hibernate는 array, set, bag등과 같은 매핑 요소를 제공함).
마지막으로 언급할만한 인터페이스는 org.hibernate.Criteria 인데 (HQL 기반인)Query 클래스의 대안으로 OO 방식으로 DB를 쿼리하는데 사용할 수 있다.

오브젝트 상태

하이버네이트는 오브젝트 인스턴스의 세가지 상태를 정의하고 있다. persistent, detached, transient
Persistent는 하이버네이트 세션과 현재 연관된 것이다. 세션이 닫히면 바로 오브젝트는 detach(탈거) 된다. 하이버네이트는 persistent 상태의 활성 세션의 자바 오브젝트가 DB의 대응되는 레코드와 일치됨을 보장한다. Transient 오브젝트는 하이버네이트 세션과 연관되지 않은 것이며 오브젝트 id 도 갖고있지 않다.

데이타 타입

하이버네이트는 일반적 어플리케이션에 필요로 하는 것보다 더 많은 수의 JAVA,SQL,하이버네이트 타입을 제공한다. 엔터티/클래스 매핑 파일에서 주어진 속성에 대해 다른 타입을 사용하면 하이버네이트가 자동적으로 하나의 타입을 다른 타입으로 변환되도록 할 수도 있다.

다음은 제공되는 타입의 일부 목록이다.
integer, long, short, float, double, character, byte, boolean, yes_no, true_false, string, date, time, timestamp, calendar, calendar_date, big_decimal, big_integer, locale, timezone, currency, class, binary, text, serializable, clob, and blob

하이버네이트 질의어 (HQL)
SELECT, UPDATE, DELETE, INSERT, FROM, WHERE, GROUP BY, ORDER BY
HQL은 하이버네이트의 강력한 SQL같은 질의 언어 이며 대소문자 무시한다. HQL은 ANSI SQL에 정의된 이상으로 많은 기능을 지원한다. 왜냐하면 HQL은 완전히 객체지향적이며 상속성,다형성 등 같은 객체지향 개념을 제공한다.  다음은 HQL이 제공하는 몇가지 기본 문장과 기능이다.

조인 (inner, outer)

서브쿼리

집합 함수 (예: sum, count)

표현식과 함수 (수학, string, date, 내장함수 등)

게다가 드문 경우지만 HQL이 부족할 때를 위한 네이티브 SQL까지 사용하도록 메소드를 제공해준다.

유일 오브젝트 식별자 (<id>)

하이버네이트는 필수적으로 매핑된 클래스가 <id> 엘리먼트를 사용하여 테이블의 기본키를 식별하도록 하고 있다. 다음은 ~~~.hbm.xml 파일에서 기본키로 정의된 departmentCode 를 보여준다.

<id name="departmentCode" column="departmentCode">
    <generator class="assigned"/>
</id>
코드에서 generator class의 "assigned" 타입: 이 오브젝트에 대한 모든 DB 동작에 앞서 어플리케이션이 id 속성값을 제공한다는 의미이다.

하이버네이트는 레코드 입력용 유일 id를 생성하는 몇가지 방법을 제공한다: increment, identity, sequence, hilo, seqhilo, uuid, guid, native, assigned, select, foreign. 하이버네이트 참조 문서에는 각각의 자세한 설명을 제공한다.

강재적인 하이버네이트 트랜젝션
API작업관련 하이버네이트 문서에 따르면 트랜젝션은 절대 옵션이 아니며 데이타 읽기나 쓰기에 상관없이 데이타베이스와의 모든 통신은 트랜젝션 내부에서 일어나야 한다.
session.beginTransaction()

session.getTransaction().commit()

session.getTransaction().rollback()

HibernateUtil.java

하이버네이트 참조 문서는 SessionFactory 를 설정하고 접근하는데(getter 를 통해) helper 클래스의 사용을 권장한다(예: HibernateUtil).
 
Helper클래스는 다음과 같은 루틴을 포함하고 있다.

SessionFactory 오브젝트를 빌드:
sessionFactory = new Configuration().configure()
                                    .buildSessionFactory();


SessionFactory를 반환하는 편리한 getter 메소드
public static SessionFactory getSessionFactory()
{
   return sessionFactory;
}


그러면 Department DB 오브젝트의 리스트를 가져오는 다음 코드처럼 Session 오브젝트를 얻을 수 있다.

List departmentList=null;
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
departmentList = session.createQuery("from Department ORDER BY name").list();
session.getTransaction().commit();