Tipuri de date acceptate

În timpul celor trei niveluri anterioare, ne-am familiarizat puțin cu Hibernate. E timpul pentru turul doi. Acum vom începe să studiem același lucru, doar mai profund. Și vom începe prin maparea câmpurilor din clasa Entity la coloanele tabelelor din baza de date.

După cum știți deja, maparea unui câmp dintr-o clasă Entitate la o coloană se face folosind adnotarea @Column . Și acum întrebarea este: ce tipuri de câmpuri pot fi mapate cu o astfel de adnotare?

Toate tipurile de date din Java pot fi împărțite în trei grupuri:

  • Tipul este destul de simplu și ușor de stocat într-o bază de date .
  • Tipul este complex și trebuie să scrieți un convertor special pentru el .
  • Tipul este foarte complex și are nevoie de un tabel separat pentru a-și stoca valorile .

Tipurile simple pe care Hibernate știe să le stocheze includ:

Tipuri în Java pachet Exemple de clasă
Tipuri Java primitive boolean , int , double etc.
Învelișuri peste primitive java.lang Boolean , Integer , Double , etc.
Siruri de caractere java.lang Şir
Numerele „avansate”. java.matematică BigInteger și BigDecimal
data si ora java.time LocalDate , LocalTime , LocalDateTime , OffsetTime , OffsetDateTime , Instant
Diverse variații de dată și oră java.util data si calendarul
Formate vechi de dată și oră java.sql Data , ora , marcajul de timp
Matrice de octeți sau caractere octet[] sau octet[] , caracter[] sau caracter[]
Enumări Orice enumerare
Obiecte serializabile Orice implementare a java.io.Serializable

Toate aceste tipuri au omologul lor în limbajul SQL, așa că Hibernate știe cum să le stocheze și să le încarce din baza de date.

Exemplu:

@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;
}

Atribuții manuale de tip - adnotare @Type

Uneori poate doriți să modificați politica Hibernate și să îi spuneți în mod explicit ce tip să stocheze datele în baza de date. De exemplu, aveți un câmp în clasa de Entitate de tip Integer, dar în bază există o coloană pentru acesta cu tipul VARCHAR.

Există o adnotare specială pentru aceasta - @Type . Pare foarte simplu:

@Type(type="type-name")

Să-i cerem, de exemplu, lui Hibernate să creeze câmpuldata creatadin clasa noastră User a fost stocată în baza de date ca șir:

@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;
}

Dacă Hibernate și-ar fi dat seama cum să convertească tipul Date în noul tip, atunci ar face-o. Dacă nu înțelege, atunci va trebui să specificați un convertor de tip special. Dar mai multe despre asta mai târziu.

Lista de tipuri de Hibernate pentru baze de date

Apropo, ați observat că am specificat tipul org.hibernate.type.StringType , nu String . Acest lucru se datorează faptului că am ales unul dintre tipurile suportate de SGBD și nu de limbajul Java. Fiecare are propriul sistem de tip. Doar că dezvoltatorii Hibernate au venit cu nume convenabile în stil Java în loc de aceste VARCHAR-uri.

Apropo, această listă nu este atât de mică. Voi da o parte din el aici:

Tip hibernare (pachetul org.hibernate.type) tip JDBC tip Java Cheile BasicTypeRegistry
StringType VARCHAR java.lang.string șir, java.lang.string
clob materializat CLOB java.lang.string materialized_clob
tip de text LONGVARCHAR java.lang.string text
tip de caracter CHAR char, java.lang.Character char, java.lang.Character
BooleanType pic boolean, java.lang.Boolean boolean, java.lang.Boolean
NumericBooleanType INTEGER, 0 este fals, 1 este adevărat boolean, java.lang.Boolean numeric_boolean
DaNuTip CHAR, „N”/“n” este fals, „Y”/“y” este adevărat. Valoarea majusculă este scrisă în baza de date. boolean, java.lang.Boolean da nu
TrueFalseType CHAR, 'F'/'f' este fals, 'T'/'t' este adevărat. Valoarea majusculă este scrisă în baza de date. boolean, java.lang.Boolean adevarat fals
ByteType TINYINT byte, java.lang.Byte byte, java.lang.Byte
tip scurt SMALLINT scurt, java.lang.Scurt scurt, java.lang.Scurt
IntegerTypes ÎNTREG int, java.lang.Integer int, java.lang.Integer
tip lung BIGINT lung, java.lang.Long lung, java.lang.Long
tip plutitor PLUTI float, java.lang.Float float, java.lang.Float
tip dublu DUBLA dublu, java.lang.Dublu dublu, java.lang.Dublu
BigIntegerType NUMERIC java.math.BigInteger mare_întreg, java.math.BigInteger
BigDecimalType NUMERIC java.math.BigDecimal big_decimal, java.math.bigDecimal
TimestampType TIMESTAMP-UL java.sql.timestamp timestamp, java.sql.timestamp
Tip de timp TIMP java.sql.Time timp, java.sql.Time
tipul de dată DATA java.sql.date data, java.sql.date
CalendarType TIMESTAMP-UL java.util.Calendar calendar, java.util.Calendar
CalendarDateType DATA java.util.Calendar calendar_date
CurrencyType java.util.Currency VARCHAR valuta, java.util.Currency
LocaleType VARCHAR java.util.locale locale, java.utility.locale
TimeZoneType VARCHAR, folosind ID-ul fusului orar java.util.TimeZone fus orar, java.util.TimeZone
UrlType VARCHAR java.net.URL url, java.net.URL
tipul clasei VARCHAR(clasa FQN) java.lang.Class clasa, java.lang.Class

Masa, desigur, este mare, dar foarte utilă. De exemplu, reiese clar din aceasta că tipul boolean poate fi stocat în baza de date în cel puțin șase moduri diferite. Nu ai nevoie de atât de mult? Și cine a spus că alegi calea de a economisi?

Nu există niciun tip boolean în SQL și este adesea stocat astfel:

  • 1 sau 0
  • 'Fort'
  • „Y” sau „N”

Prin urmare, este foarte bine când Hibernate înțelege toate aceste necazuri. Sau, de exemplu, să luăm stocarea matricelor de date în baza de date. Există o mulțime de opțiuni diferite, iar Hibernate știe cum să lucreze cu toate:

Tip hibernare (pachetul org.hibernate.type) tip JDBC tip Java BasicTypeRegistr
tip blob BLOB java.sql.blob blog, java.sql.blob
clobtype CLOB java.sql.clob clob, java.sql.clob
BinaryType VARBINAR octet[] binar, octet[]
MaterializedBlobType BLOB octet[] materializat_blob
Tip imagine LONGVARBINAR octet[] imagine
WrapperBinaryType VARBINAR java.lang.Byte[] wrapper-binary, Byte[], java.lang.Byte[]
CharArrayType VARCHAR char[] personaje, caracter[]
CharacterArrayType VARCHAR java.lang.Character[] wrapper-characters, Character[], java.lang.Character[]
UUIDBinaryType BINAR java.util.UUID uuid-binary, java.util.UUID
UUIDcharType CHAR, poate citi și VARCHAR java.util.UUID uuid-char
PostgreSQLUUIDType UUID PostgreSQL, prin Types#OTHER, care respectă definiția driverului PostgreSQL JDBC java.util.UUID pg-uuid
Și de la lansarea JDK 8, Hibernate a adăugat alte câteva tipuri legate de timp. Totul pentru a-ți face viața mai ușoară. Nu mai trebuie să vă întrebați dacă toate aceste tipuri noi sunt acceptate. Creatorii Hibernate și-au adăugat deja suportul pentru tine:
Tip hibernare (pachetul org.hibernate.type) tip JDBC tip Java BasicTypeRegistr
DurationType BIGINT java.time.Durata Durata, java.time.Duration
tip instant TIMESTAMP-UL java.time.Instant Instant, java.time.Instant
LocalDateTimeType TIMESTAMP-UL java.time.LocalDateTime LocalDateTime, java.time.LocalDateTime
LocalDateType DATA java.time.LocalDate LocalDate, java.time.LocalDate
LocalTimeType TIMP java.time.LocalTime LocalTime, java.time.LocalTime
OffsetDateTimeType TIMESTAMP-UL java.time.OffsetDateTime OffsetDateTime, java.time.OffsetDateTime
OffsetTimeType TIMP java.time.OffsetTime OffsetTime, java.time.OffsetTime
OffsetTimeType TIMESTAMP-UL java.time.ZonedDateTime ZonedDateTime, java.time.ZonedDateTime