Qo'llab-quvvatlanadigan ma'lumot turlari
Oldingi uchta darajada biz Hibernate bilan biroz tanishdik. Endi esa ikkinchi davra boshlash vaqti keldi. Endi biz o'sha narsalarni o'rganishni boshlaymiz, faqat yanada chuqurroq. Va biz bu ishni Entity sinfidagi maydonlarni ma'lumotlar bazasidagi jadval ustunlariga mapping qilishdan boshlaymiz.
Sen bilganingdek, Entity sinfidagi maydonni ustunga mapping qilish @Column annotatsiyasi yordamida amalga oshiriladi. Endi esa savol: qaysi turlarga ega maydonlarni bunday annotatsiya bilan mapping qilish mumkin?
Javadagi barcha ma'lumot turlari uchta guruhga bo'linadi:
- Yetarlicha oddiy tur bo'lib, uning ma'lumotlar bazasida saqlanishi oson.
- Qiyin tur bo'lib, uning uchun maxsus konvertor yozish kerak.
- Juda qiyin tur bo'lib, uning qiymatlarini saqlash uchun alohida jadval kerak.
Oddiy turlarga Hibernate qanday saqlashni biladi, ma'lumotlar bazasida qanday saqlashni biladi:
| Java'dagi turlar | package | Sinflar misollari |
|---|---|---|
| Java'ning primitv turlari | boolean, int, double va hokazo. | |
| Primitivlar uchun o'ramalar | java.lang | Boolean, Integer, Double va hokazo. |
| Stringlar | java.lang | String |
| "Oldindan rivojlangan" raqamlar | java.math | BigInteger va BigDecimal |
| Sana va vaqt | java.time | LocalDate, LocalTime, LocalDateTime, OffsetTime, OffsetDateTime, Instant |
| Turli sana va vaqt variatsiyalari | java.util | Date va Calendar |
| Eski sana va vaqt formatlari | java.sql | Date, Time, Timestamp |
| Baitlar yoki belgilar massivi | byte[] yoki Byte[], char[] yoki Character[] | |
| Enumlar | Har qanday enum | |
| Serializatsiya qilinadigan obyektlar | Har qanday java.io.Serializable implementatsiyasi |
Bu turlar uchun SQL tilida analoglar mavjud, shu sababli Hibernate ular qanday saqlanishi va ma'lumotlar bazasidan yuklanishini yaxshi biladi.
Misol:
@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;
}
Turlarni qo'lda berish – @Type annotatsiyasi
Ba'zida sen Hibernate siyosatiga aralashishni xohlaysan va unga ma'lumotlar qanday turda saqlanishi kerakligini aniq ko'rsatishing kerak bo'ladi. Masalan, Entity sinfida maydon Integer turiga ega, lekin ma'lumotlar bazasida u uchun VARCHAR turiga ega ustun mavjud.
Buning uchun maxsus annotatsiya mavjud - @Type. U juda oddiy ko'rinadi:
@Type(type="tur-nomi")
Keling, masalan, Hibernate maydonini so'rab ko'ramiz createdDate User sinfimiz ma'lumotlar bazasida satr kabi saqlansin:
@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;
}
Agar Hibernate Date turini yangi turga qanday konvert qilishni tushunsa, u shunchaki buni qiladi. Agar tushunmasa, unda sen maxsus tur konvertorini ko'rsatishga to'g'ri keladi. Ammo bu haqida keyinroq gaplashamiz.
Ma'lumotlar bazasi uchun Hibernate turlari ro'yxati
Qiziqarli tomoni, sen e'tibor berdingmi, biz org.hibernate.type.StringType turini ko'rsatdik, String emas. Chunki biz birining ichida qo'llab-quvvatlanadigan turini tanladik, ma'lumotlar bazasi emas, balki Java. Ularning har birining o'z tur tizimi bor. Hibernate ishlab chiqaruvchilari esa bu VARCHAR'lar o'rniga Java uslubidagi qulay nomlarni o'ylab topishgan.
Aytganday, bu ro'yxat juda kichik emas. Uning bir qismini keltirib o'taman:
| Hibernate turi (org.hibernate.type package) | JDBC turi | Java turi | BasicTypeRegistry tugmachasi(lari) |
|---|---|---|---|
| StringType | VARCHAR | java.lang.String | string, java.lang.String |
| MaterializedClob | CLOB | java.lang.String | materialized_clob |
| TextType | LONGVARCHAR | java.lang.String | text |
| CharacterType | CHAR | char, java.lang.Character | char, java.lang.Character |
| BooleanType | BIT | boolean, java.lang.Boolean | boolean, java.lang.Boolean |
| NumericBooleanType | INTEGER, 0 is false, 1 is true | boolean, java.lang.Boolean | numeric_boolean |
| YesNoType | CHAR, 'N'/'n' is false, 'Y'/'y' is true. The uppercase value is written to the database. | boolean, java.lang.Boolean | yes_no |
| TrueFalseType | CHAR, 'F'/'f' is false, 'T'/'t' is true. The uppercase value is written to the database. | boolean, java.lang.Boolean | true_false |
| ByteType | TINYINT | byte, java.lang.Byte | byte, java.lang.Byte |
| ShortType | SMALLINT | short, java.lang.Short | short, java.lang.Short |
| IntegerTypes | INTEGER | int, java.lang.Integer | int, java.lang.Integer |
| LongType | BIGINT | long, java.lang.Long | long, java.lang.Long |
| FloatType | FLOAT | float, java.lang.Float | float, java.lang.Float |
| DoubleType | DOUBLE | double, java.lang.Double | double, java.lang.Double |
| BigIntegerType | NUMERIC | java.math.BigInteger | big_integer, java.math.BigInteger |
| BigDecimalType | NUMERIC | java.math.BigDecimal | big_decimal, java.math.bigDecimal |
| TimestampType | TIMESTAMP | java.sql.Timestamp | timestamp, java.sql.Timestamp |
| TimeType | TIME | java.sql.Time | time, java.sql.Time |
| DateType | DATE | java.sql.Date | date, java.sql.Date |
| CalendarType | TIMESTAMP | java.util.Calendar | calendar, java.util.Calendar |
| CalendarDateType | DATE | java.util.Calendar | calendar_date |
| CurrencyType | java.util.Currency | VARCHAR | currency, java.util.Currency |
| LocaleType | VARCHAR | java.util.Locale | locale, java.utility.locale |
| TimeZoneType | VARCHAR, using the TimeZone ID | java.util.TimeZone | timezone, java.util.TimeZone |
| UrlType | VARCHAR | java.net.URL | url, java.net.URL |
| ClassType | VARCHAR (class FQN) | java.lang.Class | class, java.lang.Class |
Tablitsa, albatta, katta, lekin juda foydali. Masalan, uning ichidan ko'rinib turibdi, Boolean ma'lumot turi ma'lumotlar bazasida kamida oltita turli uslubda saqlanishi mumkin. Sen uchun shuning o'zi yetarmi? Kim aytdi, saqlash uslubi sening tanloving ekanini?
SQL tilida Boolean turi mavjud emas va uni ko'pincha quyidagicha saqlashadi:
- 1 yoki 0
- ‘F’ yoki ‘T’
- ‘Y’ yoki ‘N’
Shuning uchun Hibernate ushbu mayda narsalarni yaxshi tushungani juda yaxshi. Yoki, masalan, ma'lumotlar bazasida ma'lumot massivlarini saqlashni olaylik. Turli xil imkoniyatlar ko'p va Hibernate ularning barchasi bilan ishlashni biladi:
| Hibernate turi (org.hibernate.type package) | JDBC turi | Java turi | BasicTypeRegistr |
|---|---|---|---|
| BlobType | BLOB | java.sql.Blob | blog, java.sql.Blob |
| ClobType | CLOB | java.sql.Clob | clob, java.sql.Clob |
| BinaryType | VARBINARY | byte[] | binary, byte[] |
| MaterializedBlobType | BLOB | byte[] | materized_blob |
| ImageType | LONGVARBINARY | byte[] | image |
| WrapperBinaryType | VARBINARY | java.lang.Byte[] | wrapper-binary, Byte[], java.lang.Byte[] |
| CharArrayType | VARCHAR | char[] | characters, char[] |
| CharacterArrayType | VARCHAR | java.lang.Character[] | wrapper-characters, Character[], java.lang.Character[] |
| UUIDBinaryType | BINARY | java.util.UUID | uuid-binary, java.util.UUID |
| UUIDCharType | CHAR, can also read VARCHAR | java.util.UUID | uuid-char |
| PostgresUUIDType | PostgreSQL UUID, through Types#OTHER, which complies to the PostgreSQL JDBC driver definition | java.util.UUID | pg-uuid |
| Hibernate turi (org.hibernate.type package) | JDBC turi | Java turi | BasicTypeRegistr |
|---|---|---|---|
| DurationType | BIGINT | java.time.Duration | Duration, java.time.Duration |
| InstantType | TIMESTAMP | java.time.Instant | Instant, java.time.Instant |
| LocalDateTimeType | TIMESTAMP | java.time.LocalDateTime | LocalDateTime, java.time.LocalDateTime |
| LocalDateType | DATE | java.time.LocalDate | LocalDate, java.time.LocalDate |
| LocalTimeType | TIME | java.time.LocalTime | LocalTime, java.time.LocalTime |
| OffsetDateTimeType | TIMESTAMP | java.time.OffsetDateTime | OffsetDateTime, java.time.OffsetDateTime |
| OffsetTimeType | TIME | java.time.OffsetTime | OffsetTime, java.time.OffsetTime |
| OffsetTimeType | TIMESTAMP | java.time.ZonedDateTime | ZonedDateTime, java.time.ZonedDateTime |
GO TO FULL VERSION