Migrate To Hibernate 3.0

참조: Hibernate Migration Reference

API 변경사항

패키지 이름

  • net.sf.hibernate에서 org.hibernate로 변경.
  • net.sf.hibernate.expression에서 org.hibernate.criterion으로 변경.
  • 하이버네이트를 참조하는 외부 라이브러러(EHCache 같은 경우) net.sf.ehcache.hibernate.Provider에서 org.hibernate.cache.EhCacheProvider로 변경.

Deprected Interfaces

  • org.hibernate.classic 패키지로 이동됐다.
  • Session 인터페이스의 find(), iterate(), filter(), delete() 대신에 createQuery() 사용해야 된다.
  • Session 인터페이스의 saveOrUpdateCopy()대신에 delete, merge() 해야된다.
  • 배열을 인자로 받는 createSQLQuery()는 deperecated됐다.
  • Lifecycle과 Validatable 인터페이스는 deprecated됐다. 그 대신 Interceptor나 Hibernate 3 이벤트 프레임워크를 사용하라.

종속성

  • lib/README.txt 참조할 것.

예외 모델

  • HibernateExcpetion을 비롯해 모든 예외는 Uncheched Exception으로 바꼈다.

Interceptor 인터페이스

  • 두 개의 새로운 메소드 추가 됐다. 따라서 이 인터페이스 구현체들은 비어있는 메소드 두 개를 구현해야 한다.
  • instantiate()의 인자로 Class 객체 대신에 Entity 이름을 받는 String 값을 받도록 바꼈다.
  • isUnsaved())에서 isTransient()로 메소드 이름이 바꼈다.

UserType, CompositeUserType

  • org.hibernate.usertype 패키지로 이동됐고, 새로운 메소드 몇 개가 추가 됐다.
  • ParameterizedType 인터페이스 추가됐다.

FetchMode

  • FetchMode.Lazy와 FetchMode.EAGER는 deprecated됐다. 좀 더 정확한 이름으로 FetchMode.SELECT와 FetchMode.JOIN으로 바꼈다.

PersistentEnum

  • PersustentEnum 클래스는 Hibernate3에서 제거됐다. UserType을 사용하라.

Blob과 Clob 지원

  • Blob이나 Clob 타입을 detached, serialized, merge() 메소드에 넘길 수 있고,
    특정 밴더의 타입으로 다음과 같이 변환할 수도 있다. getWrappedClob(), getWrappedBlob() 사용한다.
clob = (oracle.sql.CLOB) ( (org.hibernate.lob.SerializableClob) foo.getText() ).getWrappedClob();

확장 API

  • org.hibernate.criterion, org.hibernate.mapping, org.hibernate.persister 그리고 org.hibernate.collection 패키지는 상당히 많이 리팩터링 했다.

Metadata 변경사항

Association Fetching 전략

  • lazy=”true”를 기본값으로 바꿨다. 따라서 이 설정을 하지 않은 클래스와 컬렉션에 모두 lazy=”false”를 붙여야 한다.
  • outer-join 속성이 deprecated됐다. outer-join=”true” 대신에 fetch=”join”, outer-join=”false” 대신에 fetch=”select”를 사용하라.

식별자 맵핑

  • unsaved-value=”0″을 기본값으로 사용한다.
  • 하이버네이트 3에서 natural
    key(assigned identifier 또는 복합키)를 사용하거나 detached 객체를 쓸 때, 더이상
    Interceptor.isUnsaved() 메소드를 구현할 필요가 없다. 힌트 없으면 DB에 쿼리 날려서 객체가 새로 만든
    것인지 detached 인지 알아낸다. 따라서 그냥 isUnsaved() 사용하는게 성능에 좋겠다.

콜렉션 맵핑

  • <index>는 준-deprecated 됐다. <list-index>와
    <map-key>를 권장한다. <key-many-to-many> 대신에
    <map-key-many-to-many>, <composite-index> 대신에
    <composite-map-key>를 사용하라.

DTD

Query Language Changes

  • 하이버네이트 3은 ANTLR-based HQL/SQL query translator를 사용한다. 2.1의 쿼리 파서도 사용할 수 있다.
  • 예전 쿼리 파서를 사용하려면 hibernate.query.factory_class 속성에 org.hibernate.hql.classic.ClassicQueryTranslatorFactory
  • 새로운 파서를 사용하려면, org.hibernate.hql.ast.ASTQueryTranslatorFactory를 설정한다.
  • Note:
    there is a known bug affecting dialects with theta-style outer joins
    (eg. OracleDialect for Oracle 8i, TimesTen dialect, Sybase11Dialect).
    Try to use a dialect which supports ANSI-style joins (eg.
    Oracle9Dialect), or fall back to the old query parser if you experience
    problems.
  • elements() 대신에 명시적인 join을 사용하라.

설정 변경

  • BEA Weblogic issues 패스.

2 thoughts on “Migrate To Hibernate 3.0”

  1. 얼마전에 1-1연관 실습하면서 fech가 디폴트로 select라고 알고 있는데 lazy로딩이 안된적이 있었죠
    그래서 fech 속성이 디폴트로 select임에도 불구하고 명시적으로 지정하니까 그제서야 select가 되는걸보고 이상하다고 생각 했는데 outer-join 속성의 영향때문이었군요??

    1. 네. 이전에는 패칭 기본값이 true였는데, 이런 상태면…대부분의 상황에서는 필요 이상의 굉장히 무거운 객체 덩어리를 가져오게 되는데.. 그래서 개발자들은 명시적으로 항상 lazy=”true” 라고 매번 설정해 주어야했고.. 그런 불편을 줄이려고 하이버3에서 기본값을 패칭 전략을 아예 lazy loading으로 바꿔버린 것 같습니다.

      그래서… 개발자들에게 혼란과 마이그레이션 할 때의 불편함을 야기했지만 뭐.. 일장일단이니까 쌤쌤인것 같습니다.

Leave a Reply

Your email address will not be published. Required fields are marked *