支持的数据类型

在前面的三个级别中,我们对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