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
Dan sejak rilis JDK 8, Hibernate telah menambahkan beberapa tipe terkait waktu. Semua untuk membuat hidup Anda lebih mudah. Anda tidak perlu lagi bertanya-tanya apakah semua tipe model baru ini didukung. Pencipta Hibernate telah menambahkan dukungan mereka untuk Anda:
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