Các loại dữ liệu được hỗ trợ

Trong ba cấp độ trước, chúng ta đã làm quen một chút với Hibernate. Đã đến lúc cho vòng thứ hai. Bây giờ chúng ta sẽ bắt đầu nghiên cứu điều tương tự, chỉ sâu hơn. Và chúng ta sẽ bắt đầu bằng cách ánh xạ các trường của lớp Thực thể tới các cột của các bảng trong cơ sở dữ liệu.

Như bạn đã biết, việc ánh xạ một trường trong lớp Thực thể tới một cột được thực hiện bằng cách sử dụng chú thích @Column . Và bây giờ câu hỏi là: những loại trường nào có thể được ánh xạ với một chú thích như vậy?

Tất cả các kiểu dữ liệu trong Java có thể được chia thành ba nhóm:

  • Loại này khá đơn giản và dễ dàng lưu trữ trong cơ sở dữ liệu .
  • Loại này phức tạp và bạn cần viết một trình chuyển đổi đặc biệt cho nó .
  • Loại này rất phức tạp và cần một bảng riêng để lưu trữ các giá trị của nó .

Các loại đơn giản mà Hibernate biết cách lưu trữ bao gồm:

Các loại trong Java bưu kiện Ví dụ về lớp học
Các kiểu Java nguyên thủy boolean , int , double , v.v.
Trình bao bọc trên nguyên thủy java.lang Boolean , Integer , Double , v.v.
Dây java.lang Sợi dây
Số "nâng cao" java.math BigInteger BigDecimal
ngày và giờ java.time LocalDate , LocalTime , LocalDateTime , OffsetTime , OffsetDateTime , Instant
Các biến thể ngày và giờ khác nhau java.util ngày lịch
Định dạng ngày giờ cũ java.sql Ngày , Giờ , Dấu thời gian
Mảng byte hoặc ký tự byte[] hoặc Byte[] , char[] hoặc Character[]
liệt kê bất kỳ enum
đối tượng tuần tự hóa Mọi triển khai java.io.Serializable

Tất cả các loại này đều có các đối tác của chúng trong ngôn ngữ SQL, vì vậy Hibernate biết cách lưu trữ và tải chúng từ cơ sở dữ liệu.

Ví dụ:

@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;
}

Gán loại thủ công - Chú thích @Type

Đôi khi bạn có thể muốn can thiệp vào chính sách của Hibernate và nói rõ ràng cho nó biết loại lưu trữ dữ liệu trong cơ sở dữ liệu. Ví dụ: bạn có một trường trong lớp Thực thể của mình thuộc loại Số nguyên, nhưng trong cơ sở có một cột dành cho trường đó với loại VARCHAR.

Có một chú thích đặc biệt cho điều này - @Type . Nó trông rất đơn giản:

@Type(type="type-name")

Ví dụ, hãy yêu cầu Hibernate tạo trườngngày tạo racủa lớp Người dùng của chúng tôi đã được lưu trữ trong cơ sở dữ liệu dưới dạng một chuỗi:

@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;
}

Nếu Hibernate tìm ra cách chuyển đổi loại Ngày thành loại mới của bạn, thì nó sẽ làm được điều đó. Nếu nó không hiểu, thì bạn sẽ cần chỉ định một loại trình chuyển đổi đặc biệt. Nhưng nhiều hơn về điều này sau.

Danh sách các loại Hibernate cho cơ sở dữ liệu

Nhân tiện, bạn có nhận thấy rằng chúng tôi đã chỉ định loại org.hibernate.type.StringType , không phải String . Điều này là do chúng tôi đã chọn một trong các loại được hỗ trợ bởi DBMS chứ không phải bởi ngôn ngữ Java. Họ từng có hệ thống loại riêng của họ. Chỉ là các nhà phát triển Hibernate đã nghĩ ra các tên kiểu Java thuận tiện thay vì các VARCHAR này.

Nhân tiện, danh sách này không quá nhỏ. Tôi sẽ cung cấp một phần của nó ở đây:

Loại ngủ đông (gói org.hibernate.type) loại JDBC loại Java BasicType (Các) khóa đăng ký
Loại chuỗi VARCHAR java.lang.string chuỗi, java.lang.string
vật chất hóa CLOB java.lang.string cụ thể hóa_clob
dạng văn bản LONGVARCHAR java.lang.string chữ
loại ký tự CHAR ký tự, java.lang.Nhân vật ký tự, java.lang.Nhân vật
BooleanType chút boolean, java.lang.Boolean boolean, java.lang.Boolean
SốBooleanType INTEGER, 0 là sai, 1 là đúng boolean, java.lang.Boolean số_boolean
CóKhôngLoại CHAR, 'N'/'n' là sai, 'Y'/'y' là đúng. Giá trị chữ hoa được ghi vào cơ sở dữ liệu. boolean, java.lang.Boolean có không
TrueFalseType CHAR, 'F'/'f' là sai, 'T'/'t' là đúng. Giá trị chữ hoa được ghi vào cơ sở dữ liệu. boolean, java.lang.Boolean đúng sai
Loại byte TINYINT byte, java.lang.Byte byte, java.lang.Byte
loại ngắn NHỎ ngắn, java.lang.Short ngắn, java.lang.Short
Kiểu số nguyên số nguyên int, java.lang.Integer int, java.lang.Integer
loại dài LỚN dài, java.lang.Long dài, java.lang.Long
loại phao TRÔI NỔI phao, java.lang.Float phao, java.lang.Float
loại kép GẤP ĐÔI gấp đôi, java.lang.Double gấp đôi, java.lang.Double
BigIntegerType SỐ java.math.BigInteger big_integer, java.math.BigInteger
BigDecimalType SỐ java.math.BigDecimal big_decimal, java.math.bigDecimal
Loại dấu thời gian DẤU THỜI GIAN java.sql.timestamp dấu thời gian, java.sql.timestamp
Loại thời gian THỜI GIAN java.sql.Thời gian thời gian, java.sql.Time
loại ngày NGÀY java.sql.date ngày, java.sql.date
Loại lịch DẤU THỜI GIAN java.util.Calendar lịch, java.util.Calendar
LịchNgàyLoại NGÀY java.util.Calendar lịch_ngày
Loại tiền tệ java.util.Currency VARCHAR tiền tệ, java.util.Currency
Loại ngôn ngữ VARCHAR java.util.locale ngôn ngữ, java.utility.locale
Múi giờLoại VARCHAR, sử dụng ID múi giờ java.util.TimeZone múi giờ, java.util.TimeZone
Loại url VARCHAR java.net.URL url, java.net.URL
loại lớp VARCHAR(lớp FQN) java.lang.Class lớp, java.lang.Class

Tất nhiên, cái bàn lớn, nhưng rất hữu ích. Ví dụ, rõ ràng là kiểu Boolean có thể được lưu trữ trong cơ sở dữ liệu theo ít nhất sáu cách khác nhau. Bạn không cần nhiều như vậy? Và ai nói rằng bạn chọn con đường tiết kiệm?

Không có kiểu Boolean trong SQL và nó thường được lưu trữ như sau:

  • 1 hoặc 0
  • 'F' hoặc 'T'
  • 'Y' hoặc 'N'

Do đó, thật tốt khi Hibernate hiểu được tất cả những rắc rối này. Hoặc, ví dụ, hãy lưu trữ các mảng dữ liệu trong cơ sở dữ liệu. Có rất nhiều tùy chọn khác nhau và Hibernate biết cách làm việc với tất cả chúng:

Loại ngủ đông (gói org.hibernate.type) loại JDBC loại Java Cơ bảnTypeRegistr
loại đốm BÃI java.sql.blob blog, java.sql.blob
loại cục đá CLOB java.sql.clob clob, java.sql.clob
Loại nhị phân BIẾN THÂN byte[] nhị phân, byte []
Vật chất hóaBlobType BÃI byte[] materized_blob
Lọai hình ảnh DÀI BIẾN THỔ byte[] hình ảnh
WrapperLoại nhị phân BIẾN THÂN java.lang.Byte[] trình bao bọc-nhị phân, Byte[], java.lang.Byte[]
CharArrayType VARCHAR ký tự [] ký tự, ký tự []
Nhân VậtArrayType VARCHAR java.lang.Nhân vật[] ký tự bao bọc, Ký tự [], java.lang. Character []
UUIDBinaryType nhị phân java.util.UUID uuid-nhị phân, java.util.UUID
UUIDCharType CHAR, cũng có thể đọc là VARCHAR java.util.UUID uuid-char
PostgreSQLUUIDType PostgreSQL UUID, đến Type#OTHER, tuân thủ định nghĩa trình điều khiển JDBC của PostgreSQL java.util.UUID pg-uuid
Và kể từ khi phát hành JDK 8, Hibernate đã thêm một số loại liên quan đến thời gian. Tất cả để làm cho cuộc sống của bạn dễ dàng hơn. Bạn không còn phải băn khoăn liệu tất cả các loại mới lạ này có được hỗ trợ hay không. Những người tạo ra Hibernate đã thêm hỗ trợ của họ cho bạn:
Loại ngủ đông (gói org.hibernate.type) loại JDBC loại Java Cơ bảnTypeRegistr
Loại thời lượng LỚN java.time.Duration Thời lượng, java.time.Duration
loại ngay lập tức DẤU THỜI GIAN java.time.Instant Tức thì, java.time.Instant
Địa phươngDateTimeType DẤU THỜI GIAN java.time.LocalDateTime LocalDateTime, java.time.LocalDateTime
LocalDateType NGÀY java.time.LocalDate Ngày cục bộ, java.time.LocalDate
Loại thời gian cục bộ THỜI GIAN java.time.LocalTime Giờ địa phương, java.time.LocalTime
OffsetDateTimeType DẤU THỜI GIAN java.time.OffsetDateTime OffsetDateTime, java.time.OffsetDateTime
Bù đắpThời gianType THỜI GIAN java.time.OffsetTime OffsetTime, java.time.OffsetTime
Bù đắpThời gianType DẤU THỜI GIAN java.time.ZonedDateTime Đã khoanh vùngDateTime, java.time.ZonedDateTime