支持的數據類型

在前面的三個級別中,我們對Hibernate 有了一些了解。現在是第二輪的時候了。現在我們將開始研究同樣的事情,只是更深入。我們將從將實體類的字段映射到數據庫中表的列開始。

如您所知,將實體類中的字段映射到列是使用@Column註釋完成的。現在的問題是:什麼類型的字段可以用這樣的註解映射?

Java 中的所有數據類型都可以分為三組:

  • 該類型非常簡單,易於存儲在數據庫中
  • 類型複雜,需要自己寫一個專門的轉換器
  • 該類型非常複雜,需要一個單獨的表來存儲它的值。

Hibernate 知道如何存儲的簡單類型包括:

Java 中的類型 包裹 類實例
原始 Java 類型 boolean , int , double
原語包裝器 java.lang Boolean , Integer , Double
字符串 java.lang 細繩
“高級”數字 java.math 大整數大小數
日期和時間 java.time LocalDate LocalTime LocalDateTime OffsetTime OffsetDateTime Instant
各種日期和時間變化 java.util 日期日曆
舊的日期和時間格式 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 類型的字段,但在基礎中有一個類型為 VARCHAR 的字段。

這個有一個特殊的註釋 - @Type。它看起來很簡單:

@Type(type="type-name")

讓我們,例如,要求 Hibernate 製作字段創建日期我們的User類作為字符串存儲在數據庫中:

@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 類型列表

順便說一下,您是否注意到我們指定了類型org.hibernate.type.StringType,而不是String。這是因為我們選擇了 DBMS 而不是 Java 語言支持的類型之一。他們每個人都有自己的類型系統。只是 Hibernate 開發人員提出了方便的 Java 風格名稱而不是這些 VARCHAR。

順便說一句,這個列表並不小。我會在這裡給出一部分:

Hibernate 類型(org.hibernate.type 包) JDBC類型 Java類型 BasicType註冊表項
字符串類型 變量 java.lang.字符串 字符串,java.lang.string
物質化的 clob CLOB java.lang.字符串 物化_clob
文本類型 朗格查爾 java.lang.字符串 文本
字符類型 字符 字符,java.lang.Character 字符,java.lang.Character
布爾類型 少量 布爾值,java.lang.Boolean 布爾值,java.lang.Boolean
數值布爾類型 整數,0 為假,1 為真 布爾值,java.lang.Boolean numeric_boolean
是否類型 CHAR,'N'/'n'為假,'Y'/'y'為真。大寫值被寫入數據庫。 布爾值,java.lang.Boolean 是_否
真假類型 CHAR,'F'/'f' 為假,'T'/'t' 為真。大寫值被寫入數據庫。 布爾值,java.lang.Boolean 真假
字節類型 微信 字節,java.lang.Byte 字節,java.lang.Byte
短型 小情報 短,java.lang.Short 短,java.lang.Short
整數類型 整數 int, java.lang.整數 int, java.lang.整數
長型 大數據 長,java.lang.Long 長,java.lang.Long
浮點型 漂浮 浮動,java.lang.Float 浮動,java.lang.Float
雙重型 雙倍的 雙,java.lang.Double 雙,java.lang.Double
大整數類型 數字 java.math.BigInteger big_integer,java.math.BigInteger
大數類型 數字 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.日曆 日曆,java.util.Calendar
日曆日期類型 日期 java.util.日曆 日曆日期
貨幣類型 java.util.貨幣 變量 貨幣,java.util.Currency
語言環境類型 變量 java.util.locale 語言環境,java.utility.locale
時區類型 VARCHAR,使用時區 ID java.util.時區 時區,java.util.TimeZone
網址類型 變量 java.net.URL 網址,java.net.URL
班級類型 VARCHAR(FQN 類) java.lang.類 類,java.lang.Class

當然,這張桌子很大,但非常有用。例如,從中可以清楚地看出,布爾類型至少可以通過六種不同的方式存儲在數據庫中。你不需要那麼多嗎?誰說你選擇拯救的方式?

SQL中沒有Boolean類型,通常是這樣存儲的:

  • 1 或 0
  • 'F' 或 'T'
  • “是”或“否”

因此,當 Hibernate 了解所有這些麻煩時,這是非常好的。或者,例如,讓我們以數據庫中數據數組的存儲為例。有很多不同的選項,Hibernate 知道如何使用它們:

Hibernate 類型(org.hibernate.type 包) JDBC類型 Java類型 基本類型寄存器
斑點型 BLOB java.sql.blob 博客,java.sql.blob
clobtype CLOB java.sql.clob clob,java.sql.clob
二進制類型 可變二進制 字節[] 二進制,字節[]
物化Blob類型 BLOB 字節[] 物化_blob
圖像類型 長二進制 字節[] 圖像
包裝器二進制類型 可變二進制 java.lang.字節[] 包裝器二進製文件,Byte[],java.lang.Byte[]
字符數組類型 變量 字符[] 字符,字符[]
字符數組類型 變量 java.lang.字符[] 包裝字符, Character[], java.lang.Character[]
UUID二進制類型 二進制 java.util.UUID uuid 二進制,java.util.UUID
UUID字符類型 CHAR,也可以讀取VARCHAR java.util.UUID uuid 字符
PostgreSQLUUID類型 PostgreSQL UUID,通過 Types#OTHER,符合 PostgreSQL JDBC 驅動程序定義 java.util.UUID pg-uuid
自從 JDK 8 發布以來,Hibernate 添加了更多與時間相關的類型。一切為了讓您的生活更輕鬆。您不必再懷疑是否支持所有這些新奇的類型。Hibernate 的創建者已經添加了對您的支持:
Hibernate 類型(org.hibernate.type 包) JDBC類型 Java類型 基本類型寄存器
持續時間類型 大數據 java.time.持續時間 持續時間,java.time.Duration
即時型 時間戳 java.time.Instant 即時,java.time.Instant
本地日期時間類型 時間戳 java.time.LocalDateTime LocalDateTime, java.time.LocalDateTime
本地日期類型 日期 java.time.LocalDate LocalDate,java.time.LocalDate
本地時間類型 時間 java.time.LocalTime LocalTime, java.time.LocalTime
偏移日期時間類型 時間戳 java.time.OffsetDateTime OffsetDateTime, java.time.OffsetDateTime
偏移時間類型 時間 java.time.OffsetTime OffsetTime, java.time.OffsetTime
偏移時間類型 時間戳 java.time.ZonedDateTime ZonedDateTime, java.time.ZonedDateTime