Tipe data yang didukung
Selama tiga level sebelumnya, kami sedikit mengenal Hibernate. Sudah waktunya untuk putaran kedua. Sekarang kita akan mulai mempelajari hal yang sama, hanya lebih dalam. Dan kita akan mulai dengan memetakan bidang kelas Entitas ke kolom tabel di database.
Seperti yang sudah Anda ketahui, memetakan bidang dalam kelas Entitas ke kolom dilakukan menggunakan anotasi @Column . Dan sekarang pertanyaannya adalah: jenis bidang apa yang dapat dipetakan dengan anotasi seperti itu?
Semua tipe data di Java dapat dibagi menjadi tiga kelompok:
- Jenisnya cukup sederhana dan mudah disimpan dalam database .
- Jenisnya rumit dan Anda perlu menulis konverter khusus untuknya .
- Jenisnya sangat kompleks dan membutuhkan tabel terpisah untuk menyimpan nilainya .
Jenis sederhana yang Hibernate tahu cara menyimpan meliputi:
Jenis di Jawa | kemasan | Contoh kelas |
---|---|---|
Tipe Java Primitif | boolean , int , ganda , dll. | |
Pembungkus di atas primitif | java.lang | Boolean , Integer , Double , dll. |
String | java.lang | Rangkaian |
Nomor "Lanjutan". | java.math | BigInteger dan BigDecimal |
tanggal dan waktu | java.time | LocalDate , LocalTime , LocalDateTime , OffsetTime , OffsetDateTime , Instan |
Berbagai variasi tanggal dan waktu | java.util | tanggal dan kalender |
Format tanggal dan waktu lama | java.sql | Tanggal , Waktu , Stempel Waktu |
Array byte atau karakter | byte[] atau Byte[] , char[] atau Karakter[] | |
Enum | Setiap enum | |
Objek yang dapat diserialisasi | Setiap implementasi java.io.Serializable |
Semua tipe ini memiliki pasangannya dalam bahasa SQL, jadi Hibernate tahu cara menyimpan dan memuatnya dari database.
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;
}
Penugasan tipe manual - anotasi @Type
Terkadang Anda mungkin ingin mengutak-atik kebijakan Hibernate dan secara eksplisit memberi tahu tipe apa untuk menyimpan data dalam database. Misalnya, Anda memiliki bidang di kelas Entitas bertipe Integer, tetapi di basis ada kolom untuknya dengan tipe VARCHAR.
Ada anotasi khusus untuk ini - @Type . Ini terlihat sangat sederhana:
@Type(type="type-name")
Misalnya, minta Hibernate untuk membuat bidangTanggal dibuatkelas Pengguna kami disimpan dalam database sebagai string:
@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 menemukan cara mengonversi tipe Tanggal ke tipe baru Anda, maka itu akan berhasil. Jika tidak mengerti, maka Anda perlu menentukan jenis konverter khusus. Tapi lebih dari itu nanti.
Daftar tipe Hibernate untuk database
Omong-omong, apakah Anda memperhatikan bahwa kami menentukan tipe org.hibernate.type.StringType , bukan String . Ini karena kami telah memilih salah satu tipe yang didukung oleh DBMS dan bukan oleh bahasa Java. Mereka masing-masing memiliki sistem tipe mereka sendiri. Hanya saja pengembang Hibernate datang dengan nama gaya Java yang nyaman daripada VARCHAR ini.
Omong-omong, daftar ini tidak terlalu kecil. Saya akan memberikan sebagiannya di sini:
Jenis hibernasi (paket org.hibernate.type) | tipe JDBC | tipe Jawa | Kunci BasicTypeRegistry |
---|---|---|---|
Tipe String | VARCHAR | java.lang.string | string, java.lang.string |
gumpalan terwujud | KLOB | java.lang.string | materialized_clob |
Jenis Teks | LONGVARCHAR | java.lang.string | teks |
tipe karakter | ARANG | char, java.lang.Karakter | char, java.lang.Karakter |
Tipe Boolean | sedikit | boolean, java.lang.Boolean | boolean, java.lang.Boolean |
NumericBooleanType | INTEGER, 0 salah, 1 benar | boolean, java.lang.Boolean | numeric_boolean |
YaTidakJenis | CHAR, 'N'/'n' salah, 'Y'/'y' benar. Nilai huruf besar ditulis ke database. | boolean, java.lang.Boolean | ya Tidak |
TrueFalseType | CHAR, 'F'/'f' salah, 'T'/'t' benar. Nilai huruf besar ditulis ke database. | boolean, java.lang.Boolean | benar salah |
TipeByte | TINYINT | byte, java.lang.Byte | byte, java.lang.Byte |
tipe pendek | KECIL | pendek, java.lang.Pendek | pendek, java.lang.Pendek |
Tipe Bilangan Bulat | BILANGAN BULAT | int, java.lang.Integer | int, java.lang.Integer |
tipe panjang | BESAR | panjang, java.lang.Long | panjang, java.lang.Long |
tipe mengapung | MENGAMBANG | float, java.lang.Float | float, java.lang.Float |
tipe ganda | DOBEL | dobel, java.lang.Double | dobel, java.lang.Double |
Tipe Bilangan Bulat Besar | NUMERIK | java.math.BigInteger | big_integer, java.math.BigInteger |
Tipe Desimal Besar | NUMERIK | java.math.BigDecimal | desimal_besar, java.math.bigDesimal |
Jenis Stempel Waktu | URUTAN WAKTU | java.sql.timestamp | cap waktu, java.sql.cap waktu |
Jenis Waktu | WAKTU | java.sql.Waktu | waktu, java.sql.Waktu |
jenis tanggal | TANGGAL | java.sql.tanggal | tanggal, java.sql.tanggal |
Tipe Kalender | URUTAN WAKTU | java.util.Calendar | kalender, java.util.Calendar |
JenisTanggalKalender | TANGGAL | java.util.Calendar | tanggal_kalender |
Jenis mata uang | java.util.Mata uang | VARCHAR | currency, java.util.Currency |
Tipe Lokal | VARCHAR | java.util.locale | lokal, java.utilitas.lokal |
Tipe Zona Waktu | VARCHAR, menggunakan ID TimeZone | java.util.TimeZone | zona waktu, java.util.Zona Waktu |
UrlType | VARCHAR | java.net.URL | url, java.net.URL |
tipe kelas | VARCHAR (kelas FQN) | kelas java.lang | kelas, java.lang.Kelas |
Tabelnya, tentu saja, besar, tetapi sangat berguna. Misalnya, jelas bahwa tipe Boolean dapat disimpan dalam database setidaknya dalam enam cara berbeda. Apakah kamu tidak membutuhkan sebanyak itu? Dan siapa bilang Anda memilih cara untuk menabung?
Tidak ada tipe Boolean di SQL dan sering disimpan seperti ini:
- 1 atau 0
- 'F' atau 'T'
- 'Y' atau 'T'
Oleh karena itu, sangat baik jika Hibernasi memahami semua masalah ini. Atau, misalnya, mari kita simpan array data di database. Ada banyak opsi berbeda, dan Hibernate tahu cara bekerja dengan semuanya:
Jenis hibernasi (paket org.hibernate.type) | tipe JDBC | tipe Jawa | BasicTypeRegistr |
---|---|---|---|
jenis gumpalan | GUMPAL | java.sql.blob | blog, java.sql.blob |
clobtype | KLOB | java.sql.clob | gumpalan, java.sql.gumpal |
Tipe Biner | VARBINER | byte[] | biner, byte[] |
MaterializedBlobType | GUMPAL | byte[] | materialized_blob |
Jenis Gambar | LONGVARBINARY | byte[] | gambar |
WrapperBinaryType | VARBINER | java.lang.Byte[] | pembungkus-biner, Byte[], java.lang.Byte[] |
CharArrayType | VARCHAR | arang[] | karakter, karakter[] |
Tipe Susunan Karakter | VARCHAR | java.lang.Karakter[] | karakter pembungkus, Karakter[], java.lang.Karakter[] |
UUIDBinaryType | BINER | java.util.UUID | uuid-biner, java.util.UUID |
UUIDCharType | CHAR, bisa juga membaca VARCHAR | java.util.UUID | uuid-char |
PostgreSQLUUIDType | PostgreSQL UUID, melalui Types#OTHER, yang sesuai dengan definisi driver PostgreSQL JDBC | java.util.UUID | pg-uuid |
Jenis hibernasi (paket org.hibernate.type) | tipe JDBC | tipe Jawa | BasicTypeRegistr |
---|---|---|---|
Jenis Durasi | BESAR | java.waktu.Durasi | Durasi, java.waktu.Durasi |
tipe instan | URUTAN WAKTU | java.time.Instan | Instan, java.time.Instan |
Jenis TanggalWaktu Lokal | URUTAN WAKTU | java.time.LocalDateTime | LocalDateTime, java.time.LocalDateTime |
JenisTanggal Lokal | TANGGAL | java.time.LocalDate | Tanggal Lokal, java.waktu.TanggalLokal |
Jenis Waktu Lokal | WAKTU | java.time.LocalTime | Waktu Lokal, waktu java. Waktu Lokal |
OffsetDateTimeType | URUTAN WAKTU | java.time.OffsetDateTime | OffsetDateTime, java.time.OffsetDateTime |
Jenis Waktu Offset | WAKTU | java.time.OffsetTime | OffsetTime, java.time.OffsetTime |
Jenis Waktu Offset | URUTAN WAKTU | java.time.ZonedDateTime | ZonedDateTime, java.time.ZonedDateTime |
GO TO FULL VERSION