Jenis data yang disokong
Semasa tiga peringkat sebelumnya, kami membiasakan diri dengan Hibernate. Tiba masa untuk pusingan kedua. Sekarang kita akan mula mengkaji perkara yang sama, hanya lebih mendalam. Dan kita akan mulakan dengan memetakan medan kelas Entiti ke lajur jadual dalam pangkalan data.
Seperti yang anda sedia maklum, memetakan medan dalam kelas Entiti kepada lajur dilakukan menggunakan anotasi @Column . Dan kini persoalannya ialah: apakah jenis medan yang boleh dipetakan dengan anotasi sedemikian?
Semua jenis data dalam Java boleh dibahagikan kepada tiga kumpulan:
- Jenisnya agak ringkas dan mudah disimpan dalam pangkalan data .
- Jenisnya rumit dan anda perlu menulis penukar khas untuknya .
- Jenisnya sangat kompleks dan memerlukan jadual berasingan untuk menyimpan nilainya .
Jenis mudah yang Hibernate tahu cara menyimpan termasuk:
Jenis dalam Java | pakej | Contoh kelas |
---|---|---|
Jenis Java Primitif | boolean , int , double , dsb. | |
Pembungkus atas primitif | java.lang | Boolean , Integer , Double , dsb. |
rentetan | java.lang | Tali |
Nombor "Lanjutan". | java.math | BigInteger dan BigDecimal |
tarikh dan masa | java.time | LocalDate , LocalTime , LocalDateTime , OffsetTime , OffsetDateTime , Segera |
Pelbagai variasi tarikh dan masa | java.util | tarikh dan kalendar |
Format tarikh dan masa lama | java.sql | Tarikh , Masa , Cap masa |
Tatasusunan bait atau aksara | byte[] atau Byte[] , char[] atau Character[] | |
Enums | Mana-mana enum | |
Objek boleh bersiri | Sebarang pelaksanaan java.io.Serializable |
Semua jenis ini mempunyai rakan sejawatannya dalam bahasa SQL, jadi Hibernate tahu cara menyimpan dan memuatkannya daripada pangkalan data.
Contoh:
@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;
}
Tugasan jenis manual - anotasi @Type
Kadangkala anda mungkin ingin mengganggu dasar Hibernate dan secara eksplisit memberitahu jenis untuk menyimpan data dalam pangkalan data. Sebagai contoh, anda mempunyai medan dalam kelas Entiti jenis Integer anda, tetapi dalam pangkalan terdapat lajur untuknya dengan jenis VARCHAR.
Terdapat anotasi khas untuk ini - @Type . Ia kelihatan sangat mudah:
@Type(type="type-name")
Mari, sebagai contoh, minta Hibernate untuk membuat medanCreatedDatekelas Pengguna kami disimpan dalam pangkalan data sebagai rentetan:
@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;
}
Jika Hibernate mengetahui cara menukar jenis Tarikh kepada jenis baharu anda, maka ia hanya akan melakukannya. Jika ia tidak faham, maka anda perlu menentukan penukar jenis khas. Tetapi lebih lanjut mengenai itu kemudian.
Senarai jenis Hibernate untuk pangkalan data
By the way, adakah anda perasan bahawa kami menentukan jenis org.hibernate.type.StringType , bukan String . Ini kerana kami telah memilih salah satu jenis yang disokong oleh DBMS dan bukan oleh bahasa Java. Mereka masing-masing mempunyai sistem jenis mereka sendiri. Cuma pembangun Hibernate menghasilkan nama gaya Java yang mudah dan bukannya VARCHAR ini.
By the way, senarai ini tidak begitu kecil. Saya akan memberikan sebahagian daripadanya di sini:
Jenis hibernate (pakej org.hibernate.type) | jenis JDBC | jenis Java | Kunci BasicTypeRegistry |
---|---|---|---|
StringType | VARCHAR | java.lang.string | rentetan, java.lang.string |
gumpalan terwujud | CLOB | java.lang.string | materialized_clab |
jenis teks | LONGVARCHAR | java.lang.string | teks |
jenis watak | CHAR | char, java.lang.Character | char, java.lang.Character |
BooleanType | sedikit | boolean, java.lang.Boolean | boolean, java.lang.Boolean |
NumericBooleanType | INTEGER, 0 adalah palsu, 1 adalah benar | boolean, java.lang.Boolean | numeric_boolean |
YesNoType | CHAR, 'N'/'n' adalah palsu, 'Y'/'y' adalah benar. Nilai huruf besar ditulis ke pangkalan data. | boolean, java.lang.Boolean | Ya tidak |
TrueFalseType | CHAR, 'F'/'f' adalah palsu, 'T'/'t' adalah benar. Nilai huruf besar ditulis ke pangkalan data. | boolean, java.lang.Boolean | betul salah |
ByteType | TINYINT | bait, java.lang.Byte | bait, java.lang.Byte |
jenis pendek | KECIL | pendek, java.lang.Short | pendek, java.lang.Short |
IntegerTypes | INTEGER | int, java.lang.Integer | int, java.lang.Integer |
jenis panjang | BESAR | panjang, java.lang.Long | panjang, java.lang.Long |
jenis apungan | TERApung | float, java.lang.Float | float, java.lang.Float |
jenis berganda | BERGANDA | double, java.lang.Double | double, java.lang.Double |
BigIntegerType | NUMERIC | java.math.BigInteger | big_integer, java.math.BigInteger |
BigDecimalType | NUMERIC | java.math.BigDecimal | perpuluhan_besar, java.math.bigDecimal |
TimestampType | STAMP MASA | java.sql.timestamp | cap waktu, java.sql.cap waktu |
Jenis Masa | MASA | java.sql.Time | masa, java.sql.Time |
jenis tarikh | TARIKH | java.sql.date | tarikh, java.sql.date |
CalendarType | STAMP MASA | java.util.Calendar | kalendar, java.util.Calendar |
CalendarDateType | TARIKH | java.util.Calendar | tarikh_kalendar |
Jenis Mata Wang | java.util.Currency | VARCHAR | mata wang, java.util.Currency |
LocaleType | VARCHAR | java.util.locale | locale, java.utility.locale |
TimeZoneType | VARCHAR, menggunakan ID Zon Masa | java.util.TimeZone | zon waktu, java.util.TimeZone |
UrlType | VARCHAR | java.net.URL | url, java.net.URL |
jenis kelas | VARCHAR(kelas FQN) | java.lang.Class | class, java.lang.Class |
Meja, tentu saja, besar, tetapi sangat berguna. Sebagai contoh, jelas daripadanya bahawa jenis Boolean boleh disimpan dalam pangkalan data dalam sekurang-kurangnya enam cara berbeza. Tidakkah anda memerlukan sebanyak itu? Dan siapa yang mengatakan bahawa anda memilih cara untuk menyimpan?
Tiada jenis Boolean dalam SQL dan ia sering disimpan seperti ini:
- 1 atau 0
- 'F' atau 'T'
- 'Y' atau 'N'
Oleh itu, adalah sangat baik apabila Hibernate memahami semua masalah ini. Atau, sebagai contoh, mari kita ambil storan tatasusunan data dalam pangkalan data. Terdapat banyak pilihan yang berbeza, dan Hibernate tahu cara bekerja dengan mereka semua:
Jenis hibernate (pakej org.hibernate.type) | jenis JDBC | jenis Java | BasicTypeRegistr |
---|---|---|---|
jenis gumpalan | BLOB | java.sql.blob | blog, java.sql.blob |
jenis clobtype | CLOB | java.sql.clob | clob, java.sql.clob |
BinaryType | VARBINAR | bait[] | binari, bait[] |
MaterializedBlobType | BLOB | bait[] | materized_blob |
Jenis Imej | LONGVARBINARY | bait[] | gambar |
WrapperBinaryType | VARBINAR | java.lang.Byte[] | binari pembalut, Byte[], java.lang.Byte[] |
CharArrayType | VARCHAR | char[] | watak, char[] |
CharacterArrayType | VARCHAR | java.lang.Character[] | aksara pembalut, Aksara[], java.lang.Character[] |
UUIDBinaryType | BINARI | java.util.UUID | uuid-binary, java.util.UUID |
UUIDCarType | CHAR, boleh juga baca VARCHAR | java.util.UUID | uuid-char |
PostgreSQLUUIDType | PostgreSQL UUID, melalui Types#OTHER, yang mematuhi definisi pemacu PostgreSQL JDBC | java.util.UUID | pg-uuid |
Jenis hibernate (pakej org.hibernate.type) | jenis JDBC | jenis Java | BasicTypeRegistr |
---|---|---|---|
Jenis Tempoh | BESAR | java.time.Duration | Tempoh, java.time.Duration |
jenis segera | STAMP MASA | java.time.Instant | Segera, java.time.Instant |
LocalDateTimeType | STAMP MASA | java.time.LocalDateTime | LocalDateTime, java.time.LocalDateTime |
LocalDateType | TARIKH | java.time.LocalDate | LocalDate, java.time.LocalDate |
LocalTimeType | MASA | java.time.LocalTime | LocalTime, java.time.LocalTime |
OffsetDateTimeType | STAMP MASA | java.time.OffsetDateTime | OffsetDateTime, java.time.OffsetDateTime |
OffsetTimeType | MASA | java.time.OffsetTime | OffsetTime, java.time.OffsetTime |
OffsetTimeType | STAMP MASA | java.time.ZonedDateTime | ZonedDateTime, java.time.ZonedDateTime |
GO TO FULL VERSION