지원되는 데이터 유형

이전 세 가지 수준에서 우리는 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
그리고 JDK 8 릴리스 이후로 Hibernate는 몇 가지 시간 관련 유형을 더 추가했습니다. 모든 것이 당신의 삶을 더 쉽게 만들어줍니다. 이러한 최신 유형이 모두 지원되는지 더 이상 궁금해할 필요가 없습니다. Hibernate의 제작자는 이미 다음과 같은 지원을 추가했습니다.
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