특징

  • ORM은 자바의 타입과 SQL 데이터타입을 중개해 주는 역할을 해야한다.
  • 하이버는 보통 자바 타입 이름을 따르고 있다. 하지만 자바 타입 하나에 여러 하이버네이트 타입이 있을 수 있다.
  • Custom Value Type을 정의할 수 있다.

자바 기본 타입 맵핑

  • 벤더가 ANSI 표준을 따르지 않을 수도 있다. 그래도 JDBC 드라이버는 추상화 계층을 제공해 주니까 이걸 하이버네이트가 읽어 들여서 벤더에 적당한 타입으로 변환해준다.
  • 즉, 사용자는 타입 걱정하지 않아도 된다.
  • 문자열의 길이 제한 설정(length 속성 값)에 따라서 하이버가 적당한 타입으로 결정한다.
  • 이런 전략 자체도 사용자 맘대로 변경할 수 있다.
Java Type Hibernate Mapping Type SQL Type
int, Integer integer INTEGER
long, Long long BIGINT
short, Short short SMALLINT
float, FLOAT float FLOAT
double, Double double DOUBLE
BigDecimal big_decimal NUMERIC
String character CHAR(1)
String string VARCHAR
byte, Byte byte TINYINT
boolean, Boolean boolean BIT
boolean, Boolean yes_no CHAR(1) ('Y' or 'N')
boolean, Boolean true_false CHAR(1) ('T' or 'F')

날짜와 시간 맵핑

  • java.util.Date 타입을 timestamp로 맵핑할 경우 DB에서 나노초까지 값을 가져온다.
  • 책을 쓸 시점에서는 나노초를 짤라주지 않아서, equlas() 메소드로 비교할 경우 Date.getTime() 으로 비교하거나 Custom Mapping Type을 만들어서 사용해야 한다.
Java Type Hibernate Mapping Type SQL Type
java.util.Data, java.sql.Date date DATE
java.util.Date, Java.sql.Time time TIME
java.util.Date, java.sql.Timestamp timetamp TIMESTAMP
java.util.Calendar calendar TIMESTAMP
java.util.Calendar calendar_date DATE

바이너리와 큰 값 맵핑

  • binary 맵핑 타입만 식별자 속성으로 사용할 수 있다.
  • byte[]일 경우에는 VARBINARY로 맵핑하고, String일 경우에는 CLOB로 맵핑할 수 있다.
  • 이 두 경우에 Entity 객체가 속성 값을 읽어들일 때, 초기화를 하려고 할텐데, 너무 큰 값이라서 Lazy loading 하고 싶을 수 있다.
  • 특정 속성을 lazy loading 하는 두 가지 방법이 있다.

    • 13.1.6에서 다루는 Lazy loading with interception
    • java.sql.Clob 나 java.sql.Blob 타입을 사용한다.(로딩하는 시점에 Entity는 Persistent 상태여야 한다.)
  • JPA를 사용할 때 String 타입은 기본으로 VARCHAR로 맵핑 된다. Clob 타입으로 맵핑하려면 @Lob 애노테이션을 사용한다.
  • Serializable 타입은 변수의 값을 바이트 스트림으로 바꿔서 VARBINARY 타입 컬럼에 저장한다. 로딩할 때는 역직렬화한다.
Java Type Hibernate Mapping Type SQL Type
byte[] binary VARBINARY
String text CLOB
java.sql.Clob clob CLOB
java.sql.Blob blob BLOB
java.io.Serializable serializable VARBINARY

JDK 맵핑 타입

  • <property>만 type 속성을 가진 것은 아니다.
Java Type Hibernate Mapping Type SQL Type
java.lang.Class class VARCHAR
java.util.Locale locale VARCHAR
java.util.TimeZone timezone VARCHAR
java.util.Currency currency VARCHAR