支持的数据类型
在前面的三个级别中,我们对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