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 và 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 và 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 |
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 |
GO TO FULL VERSION