내장된 맵핑 타입
특징
- 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 |