지원되는 데이터 유형
이전 세 가지 수준에서 우리는 Hibernate에 대해 조금 알게 되었습니다. 두 번째 라운드의 시간입니다. 이제 우리는 같은 것을 더 깊이 연구하기 시작할 것입니다. 그리고 Entity 클래스의 필드를 데이터베이스의 테이블 열에 매핑하는 것으로 시작합니다.
이미 알고 있듯이 Entity 클래스의 필드를 열에 매핑하는 것은 @Column 주석을 사용하여 수행됩니다 . 이제 문제는 이러한 주석으로 매핑할 수 있는 필드 유형은 무엇입니까?
Java의 모든 데이터 유형은 세 그룹으로 나눌 수 있습니다.
- 유형은 매우 간단하고 데이터베이스에 저장하기 쉽습니다 .
- 형식이 복잡하고 이에 대한 특수 변환기를 작성 해야 합니다 .
- 유형은 매우 복잡하며 해당 값을 저장하기 위해 별도의 테이블이 필요합니다 .
Hibernate가 저장 방법을 알고 있는 간단한 유형은 다음과 같습니다.
자바의 유형 | 패키지 | 수업 예시 |
---|---|---|
기본 자바 유형 | 부울 , int , double 등 | |
프리미티브에 대한 래퍼 | java.lang | Boolean , Integer , Double 등 |
문자열 | java.lang | 끈 |
"고급" 번호 | 자바.수학 | BigInteger 및 BigDecimal |
날짜와 시간 | java.time | LocalDate , LocalTime , LocalDateTime , OffsetTime , OffsetDateTime , Instant |
다양한 날짜 및 시간 변형 | 자바.유틸 | 날짜 와 달력 |
이전 날짜 및 시간 형식 | java.sql | 날짜 , 시간 , 타임스탬프 |
바이트 또는 문자 배열 | byte[] 또는 Byte[] , char[] 또는 Character[] | |
열거형 | 모든 열거형 | |
직렬화 가능한 객체 | java.io.Serializable 구현 |
이러한 모든 유형은 SQL 언어로 된 대응물을 가지고 있으므로 Hibernate는 데이터베이스에서 저장하고 로드하는 방법을 알고 있습니다.
예:
@Entity
@Table(name="user")
class User
{
@Column(name="id")
public Integer id;
@Column(name="name")
public String name;
@Column(name="level")
public Integer level;
@Column(name="created_date")
public Date createdDate;
}
수동 유형 지정 - @Type 어노테이션
때때로 당신은 Hibernate의 정책을 변경하고 데이터베이스에 데이터를 저장할 유형을 명시적으로 알려줄 수 있습니다. 예를 들어 Integer 유형의 Entity 클래스에 필드가 있지만 기본에는 VARCHAR 유형의 열이 있습니다.
이에 대한 특별한 주석이 있습니다 - @Type . 매우 간단해 보입니다.
@Type(type="type-name")
예를 들어 Hibernate에게 필드를 만들도록 요청합시다.만든 날짜사용자 클래스 의 데이터는 데이터베이스에 문자열로 저장되었습니다.
@Entity
@Table(name="user")
class User
{
@Column(name="id")
public Integer id;
@Column(name="created_date")
@Type(type="org.hibernate.type.StringType")
public Date createdDate;
}
Hibernate가 Date 타입을 당신의 새로운 타입으로 변환하는 방법을 알아냈다면, 그냥 그렇게 할 것입니다. 이해하지 못하는 경우 특수 유형 변환기를 지정해야 합니다. 그러나 나중에 더 자세히 설명합니다.
데이터베이스에 대한 Hibernate 유형 목록
그건 그렇고, 우리가 String 이 아닌 org.hibernate.type.StringType 유형을 지정했다는 것을 알아채셨나요 ? 이는 Java 언어가 아닌 DBMS에서 지원하는 유형 중 하나를 선택했기 때문입니다. 그들은 각각 고유한 유형 시스템을 가지고 있습니다. Hibernate 개발자가 이러한 VARCHAR 대신에 편리한 Java 스타일 이름을 생각해 냈을 뿐입니다.
그건 그렇고, 이 목록은 그렇게 작지 않습니다. 여기에 그 일부를 제공합니다.
Hibernate 유형(org.hibernate.type 패키지) | JDBC 유형 | 자바 유형 | BasicType레지스트리 키 |
---|---|---|---|
문자열 유형 | VARCHAR | java.lang.string | 문자열, java.lang.string |
구체화된 덩어리 | 클롭 | java.lang.string | materialized_clob |
텍스트 유형 | 롱바차 | java.lang.string | 텍스트 |
문자 유형 | 숯 | 문자, java.lang.문자 | 문자, java.lang.문자 |
부울 유형 | 조금 | 부울, java.lang.Boolean | 부울, java.lang.Boolean |
NumericBooleanType | INTEGER, 0은 거짓, 1은 참 | 부울, java.lang.Boolean | numeric_boolean |
예아니오유형 | CHAR, 'N'/'n'은 거짓이고 'Y'/'y'는 참입니다. 대문자 값이 데이터베이스에 기록됩니다. | 부울, java.lang.Boolean | 예 아니오 |
TrueFalseType | CHAR, 'F'/'f'는 거짓이고 'T'/'t'는 참입니다. 대문자 값이 데이터베이스에 기록됩니다. | 부울, java.lang.Boolean | 허위 사실 |
바이트 유형 | TINYINT | 바이트, java.lang.Byte | 바이트, java.lang.Byte |
짧은 유형 | 스몰린트 | 짧음, java.lang.Short | 짧음, java.lang.Short |
정수 유형 | 정수 | 정수, java.lang.Integer | 정수, java.lang.Integer |
긴 유형 | 비긴트 | 긴, java.lang.Long | 긴, java.lang.Long |
플로트 유형 | 뜨다 | float, java.lang.Float | float, java.lang.Float |
더블 타입 | 더블 | 더블, java.lang.Double | 더블, java.lang.Double |
BigInteger 유형 | 숫자 | java.math.BigInteger | big_integer, java.math.BigInteger |
BigDecimalType | 숫자 | java.math.BigDecimal | big_decimal, java.math.bigDecimal |
타임스탬프 유형 | 타임스탬프 | java.sql.타임스탬프 | 타임스탬프, java.sql.timestamp |
시간 유형 | 시간 | java.sql.시간 | 시간, java.sql.Time |
날짜 유형 | 날짜 | java.sql.날짜 | 날짜, java.sql.date |
달력 유형 | 타임스탬프 | java.util.Calendar | 달력, java.util.Calendar |
CalendarDateType | 날짜 | java.util.Calendar | calendar_date |
통화 유형 | java.util.통화 | VARCHAR | 통화, java.util.Currency |
로케일 유형 | VARCHAR | java.util.locale | 로케일, java.utility.locale |
시간대 유형 | VARCHAR, TimeZone ID 사용 | java.util.TimeZone | 시간대, java.util.TimeZone |
URL 유형 | VARCHAR | java.net.URL | URL, java.net.URL |
클래스 유형 | VARCHAR(클래스 FQN) | java.lang.클래스 | 클래스, java.lang.클래스 |
물론 테이블은 크지 만 매우 유용합니다. 예를 들어, Boolean 유형이 적어도 6가지 다른 방법으로 데이터베이스에 저장될 수 있다는 것이 분명합니다. 그렇게 많이 필요하지 않으세요? 누가 저장 방법을 선택한다고 말했습니까?
SQL에는 부울 유형이 없으며 종종 다음과 같이 저장됩니다.
- 1 또는 0
- '에프' 또는 '티'
- 'Y' 또는 'N'
따라서 Hibernate가 이러한 모든 문제를 이해하면 매우 좋습니다. 또는 예를 들어 데이터베이스의 데이터 배열 저장소를 살펴보겠습니다. 다양한 옵션이 있으며 Hibernate는 이러한 옵션을 모두 사용하는 방법을 알고 있습니다.
Hibernate 유형(org.hibernate.type 패키지) | JDBC 유형 | 자바 유형 | 기본 유형 레지스터 |
---|---|---|---|
얼룩 유형 | 얼룩 | java.sql.blob | 블로그, java.sql.blob |
clobtype | 클롭 | java.sql.clob | clob, java.sql.clob |
바이너리 유형 | VARBINARY | 바이트[] | 바이너리, 바이트[] |
구체화된Blob유형 | 얼룩 | 바이트[] | materized_blob |
이미지 유형 | LONGVARBINARY | 바이트[] | 영상 |
WrapperBinaryType | VARBINARY | java.lang.바이트[] | 래퍼 바이너리, Byte[], java.lang.Byte[] |
문자 배열 유형 | VARCHAR | 숯[] | 문자, 문자[] |
문자 배열 유형 | VARCHAR | java.lang.Character[] | 래퍼 문자, Character[], java.lang.Character[] |
UUIDBinaryType | 바이너리 | java.util.UUID | uuid-바이너리, java.util.UUID |
UUIDCharType | CHAR, VARCHAR도 읽을 수 있음 | java.util.UUID | uuid 문자 |
PostgreSQLUUID유형 | PostgreSQL JDBC 드라이버 정의를 준수하는 Types#OTHER를 통한 PostgreSQL UUID | java.util.UUID | pg-uuid |
Hibernate 유형(org.hibernate.type 패키지) | JDBC 유형 | 자바 유형 | 기본 유형 레지스터 |
---|---|---|---|
기간 유형 | 비긴트 | java.time.Duration | 기간, java.time.Duration |
인스턴트 유형 | 타임스탬프 | java.time.Instant | 인스턴트, java.time.Instant |
LocalDateTimeType | 타임스탬프 | java.time.LocalDateTime | LocalDateTime, java.time.LocalDateTime |
LocalDateType | 날짜 | java.time.LocalDate | LocalDate, java.time.LocalDate |
LocalTimeType | 시간 | java.time.LocalTime | LocalTime, java.time.LocalTime |
OffsetDateTimeType | 타임스탬프 | java.time.OffsetDateTime | OffsetDateTime, java.time.OffsetDateTime |
오프셋 시간 유형 | 시간 | java.time.OffsetTime | 오프셋타임, java.time.OffsetTime |
오프셋 시간 유형 | 타임스탬프 | java.time.ZonedDateTime | ZonedDateTime, java.time.ZonedDateTime |
GO TO FULL VERSION