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