Desteklenen veri türleri

Önceki üç seviyede Hibernate'e biraz aşina olduk. İkinci tur zamanı. Şimdi aynı şeyi daha derinden incelemeye başlayacağız. Ve Entity sınıfının alanlarını veritabanındaki tabloların sütunlarına eşleyerek başlayacağız.

Bildiğiniz gibi, Entity sınıfındaki bir alanı bir sütuna eşlemek, @Column ek açıklaması kullanılarak yapılır . Ve şimdi soru şu: Böyle bir ek açıklama ile ne tür alanlar eşlenebilir?

Java'daki tüm veri türleri üç gruba ayrılabilir:

  • Tip oldukça basit ve bir veritabanında saklaması kolay .
  • Tür karmaşıktır ve bunun için özel bir dönüştürücü yazmanız gerekir .
  • Tür çok karmaşıktır ve değerlerini saklamak için ayrı bir tabloya ihtiyaç duyar .

Hibernate'in nasıl saklanacağını bildiği basit türler şunları içerir:

Java'daki türler paket Sınıf örnekleri
İlkel Java Türleri boolean , int , double vb.
İlkellerin üzerindeki sarmalayıcılar java.lang Boole , Tamsayı , Çift vb.
Teller java.lang Sicim
"Gelişmiş" sayılar java matematik BigInteger ve BigDecimal
tarih ve saat java.time LocalDate , LocalTime , LocalDateTime , OffsetTime , OffsetDateTime , Instant
Çeşitli tarih ve saat varyasyonları java.util tarih ve takvim
Eski tarih ve saat biçimleri java.sql Tarih , Saat , Zaman Damgası
Bayt veya karakter dizisi bayt[] veya Bayt[] , char[] veya Karakter[]
numaralandırmalar herhangi bir numara
serileştirilebilir nesneler Java.io.Serializable'ın herhangi bir uygulaması

Tüm bu türlerin SQL dilinde karşılıkları vardır, bu nedenle Hibernate bunları veritabanından nasıl depolayacağını ve yükleyeceğini bilir.

Örnek:

@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;
}

Manuel tip atamaları - @Type ek açıklaması

Bazen Hibernate'in politikasını kurcalamak ve veri tabanında ne tür veri depolayacağını ona açıkça söylemek isteyebilirsiniz. Örneğin, Varlık sınıfınızda Tamsayı türünde bir alanınız var, ancak tabanda bunun için VARCHAR türünde bir sütun var.

Bunun için özel bir ek açıklama var - @Type . Çok basit görünüyor:

@Type(type="type-name")

Örneğin, Hibernate'den alanı oluşturmasını isteyelim.yaratılma tarihiKullanıcı sınıfımızın bir kısmı veritabanında bir dize olarak saklandı:

@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;
}

Hazırda Bekletme, Date türünü yeni türünüze nasıl dönüştüreceğinizi anladıysa, o zaman bunu yapar. Anlamazsa, özel bir tür dönüştürücü belirtmeniz gerekecektir. Ama bunun hakkında daha sonra.

Veritabanları için Hazırda Bekleme türlerinin listesi

Bu arada, String değil org.hibernate.type.StringType tipini belirttiğimizi fark ettiniz mi ? Bunun nedeni, Java dili tarafından değil, DBMS tarafından desteklenen türlerden birini seçmiş olmamızdır. Her birinin kendi tip sistemi vardır. Sadece Hibernate geliştiricileri bu VARCHAR'lar yerine uygun Java tarzı isimler buldular.

Bu arada, bu liste o kadar da küçük değil. Bir kısmını burada vereceğim:

Hazırda bekleme türü (org.hibernate.type paketi) JDBC tipi java türü BasicTypeRegistry anahtar(lar)ı
DizeTürü VARCHAR java.lang.dize dizi, java.lang.dize
maddeleşmiş bez CLOB java.lang.dize materyalize_clob
metin türü LONGVARCHAR java.lang.dize metin
karakter türü ÇAR char, java.lang.Karakter char, java.lang.Karakter
Boole Tipi biraz boolean, java.lang.Boolean boolean, java.lang.Boolean
NumericBooleanType INTEGER, 0 yanlış, 1 doğru boolean, java.lang.Boolean sayısal_boolean
EvetHayırTür CHAR, 'N'/'n' yanlış, 'Y'/'y' doğru. Büyük harf değeri veri tabanına yazılır. boolean, java.lang.Boolean Evet Hayır
DoğruYanlışTür CHAR, 'F'/'f' yanlış, 'T'/'t' doğru. Büyük harf değeri veri tabanına yazılır. boolean, java.lang.Boolean doğru yanlış
Bayt Türü TINYINT bayt, java.lang.Byte bayt, java.lang.Byte
kısa tip SMALLINT kısa, java.lang.Kısa kısa, java.lang.Kısa
Tamsayı Türleri TAM SAYI int, java.lang.Tamsayı int, java.lang.Tamsayı
uzun tip BÜYÜK uzun, java.lang.Uzun uzun, java.lang.Uzun
kayan tip BATMADAN YÜZMEK şamandıra, java.lang.Float şamandıra, java.lang.Float
çift ​​tip ÇİFT çift, java.lang.Double çift, java.lang.Double
BüyükTamsayıTürü SAYISAL java.math.BigInteger big_integer, java.math.BigInteger
BüyükOndalıkTür SAYISAL java.math.BigDecimal big_decimal, java.math.bigDecimal
Zaman damgası türü ZAMAN BİLGİSİ java.sql.timestamp zaman damgası, java.sql.timestamp
Zaman Türü ZAMAN java.sql.Zaman zaman, java.sql.Zaman
tarih türü TARİH java.sql.tarihi tarih, java.sql.date
Takvim Türü ZAMAN BİLGİSİ Java.util.Takvim takvim, java.util.Calendar
TakvimTarihTürü TARİH Java.util.Takvim takvim_tarihi
Döviz Türü java.util.Currency VARCHAR para birimi, java.util.Currency
Yerel Tür VARCHAR java.util.locale yerel ayar, java.utility.locale
Saat Dilimi Türü VARCHAR, TimeZone kimliğini kullanarak java.util.TimeZone saat dilimi, java.util.TimeZone
UrlTürü VARCHAR java.net.URL url, java.net.URL
sınıf türü VARCHAR(sınıf FQN) java.lang.Class sınıf, java.lang.Class

Masa elbette büyük ama çok kullanışlı. Örneğin, Boole tipinin veritabanında en az altı farklı şekilde saklanabileceği açıktır. Bu kadarına ihtiyacın yok mu? Ve kurtarmanın yolunu seçtiğini kim söyledi?

SQL'de Boole türü yoktur ve genellikle şu şekilde depolanır:

  • 1 veya 0
  • 'Kale'
  • 'Y' veya 'N'

Bu nedenle, Hibernate'in tüm bu sıkıntıları anlaması çok iyidir. Ya da örneğin veri dizilerinin veri tabanında depolanmasını ele alalım. Pek çok farklı seçenek vardır ve Hibernate, bunların hepsiyle nasıl çalışılacağını bilir:

Hazırda bekleme türü (org.hibernate.type paketi) JDBC tipi java türü BasicTypeRegistr
damla türü BLOB java.sql.blob blog, java.sql.blob
klozet tipi CLOB java.sql.clob Clob, java.sql.clob
BinaryType VARBINARY bayt[] ikili, bayt[]
MateryalleştirilmişBlobTürü BLOB bayt[] materized_blob
Resim türü UZUN VARBINARY bayt[] resim
SarıcıBinaryType VARBINARY Java.lang.Byte[] sarmalayıcı ikili, Bayt[], java.lang.Byte[]
Karakter Dizisi Türü VARCHAR karakter[] karakterler, karakter[]
Karakter Dizisi Türü VARCHAR Java.lang.Karakter[] sarmalayıcı karakterler, Karakter[], java.lang.Karakter[]
UUIDBinaryType İKİLİ java.util.UUID uuid-binary, java.util.UUID
UUIDCharType CHAR, VARCHAR'ı da okuyabilir java.util.UUID uuid-char
PostgreSQLUUIDType PostgreSQL JDBC sürücü tanımına uyan Types#OTHER aracılığıyla PostgreSQL UUID java.util.UUID pg-uuid
Ve JDK 8'in piyasaya sürülmesinden bu yana Hibernate zamanla ilgili birkaç tür daha ekledi. Hepsi hayatınızı kolaylaştırmak için. Artık tüm bu yeni çıkmış türlerin desteklenip desteklenmediğini merak etmenize gerek yok. Hibernate'in yaratıcıları size desteklerini çoktan eklediler:
Hazırda bekleme türü (org.hibernate.type paketi) JDBC tipi java türü BasicTypeRegistr
Süre Türü BÜYÜK java.time.Duration Süre, java.time.Duration
anlık tip ZAMAN BİLGİSİ Java.time.Anında Anında, java.time.Instant
LocalDateTimeType ZAMAN BİLGİSİ java.time.LocalDateTime LocalDateTime, java.time.LocalDateTime
YerelTarihTürü TARİH java.time.LocalDate LocalDate, java.time.LocalDate
YerelZamanTürü ZAMAN java.time.LocalTime LocalTime, java.time.LocalTime
OfsetTarihZamanTürü ZAMAN BİLGİSİ java.time.OffsetDateTime OffsetDateTime, java.time.OffsetDateTime
OfsetZamanTürü ZAMAN java.time.OffsetTime OffsetTime, java.time.OffsetTime
OfsetZamanTürü ZAMAN BİLGİSİ java.time.ZonedDateTime ZonedDateTime, java.time.ZonedDateTime