Поддържани типове данни
По време на предишните три нива се запознахме малко с 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 |
Тип хибернация (пакет 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 |
GO TO FULL VERSION