참조: 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 패스.