Поддържани типове данни

По време на предишните три нива се запознахме малко с Hibernate. Време е за втори кръг. Сега ще започнем да изучаваме същото, само по-дълбоко. И ще започнем с картографиране на полетата на класа Entity към колоните на таблиците в базата данни.

Както вече знаете, картографирането на поле в клас Entity към колона се извършва с помощта на анотацията @Column . И сега въпросът е: Howви типове полета могат да бъдат картографирани с такава анотация?

Всички типове данни в Java могат да бъдат разделени на три групи:

  • Типът е доста прост и лесен за съхранение в база данни .
  • Типът е сложен и трябва да напишете специален конвертор за него .
  • Типът е много сложен и се нуждае от отделна table за съхраняване на стойностите му .

Простите типове, които Hibernate знае How да съхранява, включват:

Типове в Java пакет Примери за класове
Примитивни типове Java boolean , int , double и т.н.
Обвивки над примитиви java.lang Boolean , Integer , Double и т.н.
струни java.lang низ
"Напреднали" номера java.math BigInteger и BigDecimal
дата и час java.time LocalDate , LocalTime , LocalDateTime , OffsetTime , OffsetDateTime , Instant
Различни вариации на дата и час java.util дата и календар
Стари формати за дата и час java.sql Дата , час , времево клеймо
Масив от byteове or знаци byte[] or Byte[] , char[] or Character[]
Енуми Всяко изброяване
Сериализирани обекти Всяка реализация на java.io.Serializable

Всички тези типове имат своите двойници в езика SQL, така че Hibernate знае How да ги съхранява и зарежда от базата данни.

Пример:

@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 и изрично да му кажете Howъв тип да съхранява данни в базата данни. Например имате поле във вашия клас Entity от тип Integer, но в основата има колона за него с тип VARCHAR.

Има специална анотация за това - @Type . Изглежда много просто:

@Type(type="type-name")

Нека например да помолим Hibernate да направи полетоcreatedDateна нашия потребителски клас се съхранява в базата данни като низ:

@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 измисли How да преобразува типа Date във вашия нов тип, тогава просто ще го направи. Ако не разбира, тогава ще трябва да посочите специален тип конвертор. Но повече за това по-късно.

Списък с типове Hibernate за бази данни

Между другото, забелязахте ли, че посочихме типа org.hibernate.type.StringType , а не String . Това е така, защото сме избрали един от типовете, поддържани от СУБД, а не от езика Java. Всеки от тях има своя собствена типова система. Просто разработчиците на Hibernate са измислor удобни имена в стил Java instead of тези VARCHAR.

Между другото, този списък не е толкова малък. Ще дам част от него тук:

Тип хибернация (пакет org.hibernate.type) Тип JDBC Тип Java BasicTypeRegistry ключ(ове)
StringType VARCHAR java.lang.string низ, java.lang.string
материализирана буца CLOB java.lang.string materialized_clob
тип текст LONGVARCHAR java.lang.string текст
тип знак CHAR char, java.lang.Character char, java.lang.Character
BooleanType малко boolean, java.lang.Boolean boolean, java.lang.Boolean
NumericBooleanType ЦЯЛО ЧИСЛО, 0 е невярно, 1 е вярно boolean, java.lang.Boolean числово_булево
ДаНеТип CHAR, 'N'/'n' е невярно, 'Y'/'y' е вярно. Стойността с главни букви се записва в базата данни. boolean, java.lang.Boolean да не
TrueFalseType CHAR, 'F'/'f' е невярно, 'T'/'t' е вярно. Стойността с главни букви се записва в базата данни. boolean, java.lang.Boolean вярно невярно
ByteType TINYINT byte, java.lang.Байт byte, java.lang.Байт
кратък тип МАЛЪК кратко, java.lang.Кратко кратко, java.lang.Кратко
Типове цели числа ЦЯЛО ЧИСЛО int, java.lang.Integer int, java.lang.Integer
дълъг тип BIGINT дълго, java.lang.Long дълго, java.lang.Long
тип поплавък ПЛАВКА float, java.lang.Float float, java.lang.Float
двоен тип ДВОЙНО двойно, java.lang.Double двойно, java.lang.Double
BigIntegerType ЧИСЛО java.math.BigInteger big_integer, java.math.BigInteger
BigDecimalType ЧИСЛО java.math.BigDecimal big_decimal, java.math.bigDecimal
TimestampType КЛАПОТО ЗА ЧАС java.sql.timestamp времево клеймо, java.sql.времево клеймо
Тип време ВРЕМЕ java.sql.Time време, java.sql.Time
тип дата ДАТА java.sql.date дата, java.sql.date
CalendarType КЛАПОТО ЗА ЧАС java.util.Calendar календар, java.util.Calendar
CalendarDateType ДАТА java.util.Calendar календарна_дата
CurrencyType java.util.Валута VARCHAR валута, java.util.Currency
LocaleType VARCHAR java.util.locale локал, java.utility.locale
TimeZoneType VARCHAR, използвайки ID на часовата зона java.util.TimeZone часова зона, java.util.TimeZone
UrlType VARCHAR java.net.URL url, java.net.URL
тип клас VARCHAR(клас FQN) java.lang.Class клас, java.lang.Class

Масата, разбира се, е голяма, но много полезна. Например, от него става ясно, че типът Boolean може да се съхранява в базата данни по най-малко шест различни начина. Не ти ли трябва толкова много? И кой каза, че вие ​​избирате начина за спестяване?

В SQL няма булев тип и той често се съхранява по следния начин:

  • 1 or 0
  • „F“ or „T“
  • „Да“ or „Н“

Затова е много добре, когато Hibernate разбира всички тези проблеми. Или, например, нека вземем съхранението на масиви от данни в базата данни. Има куп различни опции и Hibernate знае How да работи с всички тях:

Тип хибернация (пакет org.hibernate.type) Тип JDBC Тип Java BasicTypeRegistr
тип петно BLOB java.sql.blob блог, java.sql.blob
клоб тип CLOB java.sql.clob clob, java.sql.clob
двоичен тип ВАРБИНАРИЯ byte[] двоичен, byte[]
MaterializedBlobType BLOB byte[] материализиран_блок
Тип изображение LONGVARBINARY byte[] изображение
WrapperBinaryType ВАРБИНАРИЯ java.lang.Byte[] обвивка-двоичен файл, byte [], java.lang.Байт []
CharArrayType VARCHAR символ [] знаци, знак []
CharacterArrayType VARCHAR java.lang.Character[] обвивка-знаци, Знак [], java.lang.Знак []
UUIDBinaryType ДВОИЧЕН java.util.UUID uuid-двоичен, java.util.UUID
UUIDCharType CHAR, може също да чете VARCHAR java.util.UUID uuid-char
PostgreSQLUUIDType PostgreSQL UUID, чрез Types#OTHER, който отговаря на дефиницията на PostgreSQL JDBC драйвера java.util.UUID pg-uuid
И след пускането на JDK 8, Hibernate добави още няколко типа, свързани с времето. Всичко, за да направи живота ви по-лесен. Вече не е нужно да се чудите дали всички тези новомодни типове се поддържат. Създателите на Hibernate вече са добавor своята поддръжка за вас:
Тип хибернация (пакет org.hibernate.type) Тип JDBC Тип Java BasicTypeRegistr
DurationType BIGINT java.time.Duration Продължителност, java.time.Duration
незабавен тип КЛАПОТО ЗА ЧАС java.time.Instant Моментално, java.time.Instant
LocalDateTimeType КЛАПОТО ЗА ЧАС java.time.LocalDateTime LocalDateTime, java.time.LocalDateTime
LocalDateType ДАТА java.time.LocalDate Местна дата, java.time.LocalDate
LocalTimeType ВРЕМЕ java.time.LocalTime Местно време, java.time.LocalTime
OffsetDateTimeType КЛАПОТО ЗА ЧАС java.time.OffsetDateTime OffsetDateTime, java.time.OffsetDateTime
OffsetTimeType ВРЕМЕ java.time.OffsetTime OffsetTime, java.time.OffsetTime
OffsetTimeType КЛАПОТО ЗА ЧАС java.time.ZonedDateTime ZonedDateTime, java.time.ZonedDateTime