Աջակցվող տվյալների տիպեր
Նախորդ երեք մակարդակներում մենք ծանոթացել ենք Hibernate-ի հետ: Ժամանակն է երկրորդ շրջանը կատարել։ Այժմ մենք սկսենք նույնը ուսումնասիրել, բայց ավելի խորը։ Եվ մենք կսկսենք Entity-դասի դաշտերի մապինգից տվյալների բազայի սյունակներին:
Ինչպես դու արդեն գիտես, Entity դասի դաշտի մապինգը սյունակի վրա իրականացվում է @Column անոտացիայի միջոցով։ Եվ այստեղ հարց կարող է առաջանալ՝ ինչպիսի՞ տիպերի դաշտեր կարելի է այս անոտացիայով մապինգ անել:
Java-ում բոլոր տվյալների տիպերը կարելի է բաժանել երեք խմբի:
- Տիպը բավականին պարզ է և հեշտ է պահպանել տիպը տվյալների բազայում:
- Տիպը բարդ է և դրա համար անհրաժեշտ է գրել հատուկ կոնվերտոր:
- Տիպը չափազանց բարդ է և դրա արժեքները պահպանելու համար անջատ սյունակ է անհրաժեշտ:
Մինչ պարզ տիպեր, որոնց մասին Hibernate գիտի, ինչպես պահպանել, պատկանում են հետևյալները:
Տիպեր Java լեզվում | package | Օրինակներ |
---|---|---|
Java լեզվի պարզ տիպեր | boolean, int, double և այլն. | |
Պրիմիտիվների աղբյուրներ | java.lang | Boolean, Integer, Double և այլն. |
Տողեր | java.lang | String |
"Առաջադեմ" թվեր | java.math | BigInteger և BigDecimal |
Ամսաթիվ և ժամանակ | java.time | LocalDate, LocalTime, LocalDateTime, OffsetTime, OffsetDateTime, Instant |
Սովորական ձևեր ամսաթվի և ժամանակի | java.util | Date և Calendar |
Հին ձևեր ամսաթվի և ժամանակի | java.sql | Date, Time, Timestamp |
Բայթերի կամ չարերի զանգված | byte[] կամ Byte[], char[] կամ Character[] | |
Պարզաբանումներ (enum) | Ցանկացած enum | |
Սերիալիզելի օբյեկտներ | Ցանկացած java.io.Serializable-ի իմպլեմենտացիա |
Այս բոլոր տիպերի համար կա դրանց մեջեղարքային լեզվով SQL անալոգը, բայց Hibernate լավ գիտի, ինչպես դրանք պահպանել և վերբեռնել տվյալների բազայից:
Օրինակ:
@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;
}
Տիպերի ձեռքով նշանակումը – @Type անոտացիա
Երբեմն կարող ես ցանկանալ, որ Hibernate-ի քաղաքականության մեջ միջամտես և հստակ նշես նրան, թե ինչ տիպով պահել տվյալները բազայի մեջ։ Օրինակ, եթե քեզ մոտ Entity դասի դաշտ ունի Integer տիպ, բայց բազայում դրա համար կա VARCHAR տիպի սյունակ:
Դրա համար կա հատուկ անոտացիա – @Type։ Այն շատ պարզ է տեսքով:
@Type(type="տիպի-անուն")
Օրինակ խնդրենք Hibernate-ին, որ մեր createdDate դաշտը User դասի մեջ պահպանվի որպես տող:
@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;
}
Եթե Hibernate կգտնի, թե ինչպես կոնվերտացնել Date տիպը քո նոր տիպի, ապա ուղղակի կանի դա։ Եթե չգտնի, ապա պիտի նշես հատուկ տիպների կոնվերտոր: Բայց դրա մասին մի փոքր ավելի ուշ։
Բազաների համար Hibernate-տիպերի ցանկ՝
Ժամանակին դու նկատեցիր, որ մենք նշեցինք org.hibernate.type.StringType, ոչ թե String։ Դա այն պատճառով է, որ մենք ընտրեցինք մեկ տիպ, որը կապակցված է СУБД-ի հետ, ոչ թե Java լեզվի։ Նրանցից յուրաքանչյուրը ունի տիպերի իր համակարգը։ Պարզապես Hibernate-ի մշակողները ստեղծեցին հարմար անուններ Java ոճով, փոխարեն այդ VARCHAR-ների:
Եթե արդեն նկատեցիր, այս ցանկը բավականին մեծ է։ Տվյալների բազաների համար այս մասի ցուցակն այստեղ եմ բերում.
Hibernate type (org.hibernate.type package) | JDBC type | Java type | BasicTypeRegistry key(s) |
---|---|---|---|
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 |
Այս սեղանը, իհարկե, մեծ է, բայց շատ օգտակար։ Օրինակ, դրա մեջից պարզ է, որ Boolean տիպը կարող է պահվել տվյալների բազայում առնվազն վեց տարբեր եղանակներով։ Քեզ այդքան պետք չէ՞։ Բայց ով ասաց, որ պահպանման եղանակը դու ընտրում ես՞։
SQL-ում Boolean տիպ չկա, և այն հաճախ պահում են այսպես․
- 1 կամ 0
- ‘F’ կամ ‘T’
- ‘Y’ կամ ‘N’
Ուստի շատ լավ է, երբ Hibernate-ը հասկանում է այս բոլոր խճճվածությունները։ Կամ, օրինակ, վերցնենք տվյալների զանգվածների պահումը տվյալների բազայում։ Կան շատ տարբեր տարբերակներ, և Hibernate-ը կարող է դրանց բոլորի հետ աշխատել․
Hibernate type (org.hibernate.type package) | JDBC type | Java type | 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 type (org.hibernate.type package) | JDBC type | Java type | 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 |
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ