JavaRush /Курсы /All lectures for AM purposes /Տվյալների տիպերի մապինգ

Տվյալների տիպերի մապինգ

All lectures for AM purposes
1 уровень , 279 лекция
Открыта

Աջակցվող տվյալների տիպեր

Նախորդ երեք մակարդակներում մենք ծանոթացել ենք 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
JDK 8-ի թողարկումից հետո Hibernate-ում ավելացվեցին նաև մի քանի տիպեր, կապված ժամանակի հետ։ Անհրաժեշտ է միայն մեկ բան՝ հնարավորություն տալ քեզ։ Այդպես դու չես կարիք ունենալ մտածել, արդյոք այս նորամոդայիկ տիպերը աջակցվում են թե ոչ։ Hibernate-ի ստեղծողները արդեն ավելացրել են դրանց աջակցությունը քեզ համար․
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
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ