支持的數據類型
在前面的三個級別中,我們對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 |
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 |
GO TO FULL VERSION