Tipi di dati supportati

Durante i tre livelli precedenti, abbiamo acquisito un po' di familiarità con Hibernate. È il momento del secondo round. Ora inizieremo a studiare la stessa cosa, solo più a fondo. E inizieremo mappando i campi della classe Entity alle colonne delle tabelle nel database.

Come già saprai, la mappatura di un campo in una classe Entity su una colonna viene eseguita utilizzando l' annotazione @Column . E ora la domanda è: quali tipi di campi possono essere mappati con una tale annotazione?

Tutti i tipi di dati in Java possono essere suddivisi in tre gruppi:

  • Il tipo è abbastanza semplice e facile da memorizzare in un database .
  • Il tipo è complesso ed è necessario scrivere un convertitore speciale per esso .
  • Il tipo è molto complesso e necessita di una tabella separata per memorizzare i suoi valori .

I tipi semplici che Hibernate sa come memorizzare includono:

Tipi in Java pacchetto Esempi di classe
Tipi Java primitivi boolean , int , double , ecc.
Wrapper su primitive java.lang Boolean , Integer , Double , ecc.
stringhe java.lang Corda
Numeri "avanzati". java.math BigInteger e BigDecimal
data e ora java.time LocalDate , LocalTime , LocalDateTime , OffsetTime , OffsetDateTime , Instant
Varie variazioni di data e ora java.util data e calendario
Vecchi formati di data e ora java.sql Data , Ora , Timestamp
Matrice di byte o caratteri byte[] o Byte[] , char[] o Carattere[]
Enum Qualsiasi enum
Oggetti serializzabili Qualsiasi implementazione di java.io.Serializable

Tutti questi tipi hanno le loro controparti nel linguaggio SQL, quindi Hibernate sa come memorizzarli e caricarli dal database.

Esempio:

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

Assegnazioni di tipi manuali - Annotazione @Type

A volte potresti voler manomettere la politica di Hibernate e dirgli esplicitamente di che tipo memorizzare i dati nel database. Ad esempio, hai un campo nella tua classe Entity di tipo Integer, ma nella base c'è una colonna per esso con tipo VARCHAR.

C'è un'annotazione speciale per questo - @Type . Sembra molto semplice:

@Type(type="type-name")

Ad esempio, chiediamo a Hibernate di creare il campoData di Creazionedella nostra classe utente è stata memorizzata nel database come stringa:

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

Se Hibernate avesse capito come convertire il tipo Date nel tuo nuovo tipo, lo avrebbe fatto. Se non capisce, dovrai specificare un convertitore di tipo speciale. Ma ne parleremo più avanti.

Elenco dei tipi di ibernazione per i database

A proposito, hai notato che abbiamo specificato il tipo org.hibernate.type.StringType , non String . Questo perché abbiamo scelto una delle tipologie supportate dal DBMS e non dal linguaggio Java. Ognuno di loro ha il proprio sistema di tipi. È solo che gli sviluppatori di Hibernate hanno inventato comodi nomi in stile Java invece di questi VARCHAR.

A proposito, questo elenco non è così piccolo. Ne riporto una parte qui:

Tipo di ibernazione (pacchetto org.hibernate.type) Tipo JDB tipo Java BasicTypeChiavi di registro
StringType VARCHAR java.lang.stringa stringa, java.lang.stringa
clob materializzato CLUB java.lang.stringa materializzato_clob
Tipo di testo LONGVARCHAR java.lang.stringa testo
tipo di carattere CAR char, java.lang.Character char, java.lang.Character
Tipo booleano morso boolean, java.lang.Boolean boolean, java.lang.Boolean
NumericBooleanType INTERO, 0 è falso, 1 è vero boolean, java.lang.Boolean numerico_booleano
SìNoTipo CHAR, 'N'/'n' è falso, 'Y'/'y' è vero. Il valore maiuscolo viene scritto nel database. boolean, java.lang.Boolean si No
TrueFalseType CHAR, 'F'/'f' è falso, 'T'/'t' è vero. Il valore maiuscolo viene scritto nel database. boolean, java.lang.Boolean vero falso
ByteType TINYINT byte, java.lang.Byte byte, java.lang.Byte
tipo breve SMALLINT breve, java.lang.Short breve, java.lang.Short
Tipi interi NUMERO INTERO int, java.lang.Integer int, java.lang.Integer
tipo lungo BIGINT lungo, java.lang.Long lungo, java.lang.Long
tipo galleggiante GALLEGGIANTE float, java.lang.Float float, java.lang.Float
doppio tipo DOPPIO doppio, java.lang.Doppio doppio, java.lang.Doppio
BigIntegerType NUMERICO java.math.BigInteger big_integer, java.math.BigInteger
BigDecimalType NUMERICO java.math.BigDecimal big_decimal, java.math.bigDecimal
Tipo timestamp TIMESTAMP java.sql.timestamp timestamp, java.sql.timestamp
Tipo di tempo TEMPO java.sql.Time tempo, java.sql.Time
tipo di data DATA java.sql.data data, java.sql.date
Tipo di calendario TIMESTAMP java.util.Calendar calendario, java.util.Calendar
TipoDataCalendario DATA java.util.Calendar calendario_data
Tipo di valuta java.util.Currency VARCHAR valuta, java.util.Currency
LocaleType VARCHAR java.util.locale locale, java.utility.locale
Tipo di fuso orario VARCHAR, utilizzando l'ID fuso orario java.util.TimeZone fuso orario, java.util.TimeZone
Tipo URL VARCHAR java.net.URL url, java.net.URL
tipo di classe VARCHAR(classe FQN) java.lang.Class classe, java.lang.Class

Il tavolo, ovviamente, è grande, ma molto utile. Ad esempio, è chiaro che il tipo booleano può essere memorizzato nel database in almeno sei modi diversi. Non ti serve così tanto? E chi ha detto che scegli tu la strada per risparmiare?

Non esiste un tipo booleano in SQL ed è spesso memorizzato in questo modo:

  • 1 o 0
  • 'F' o 'T'
  • 'Y' o 'N'

Pertanto, è molto positivo quando Hibernate comprende tutti questi problemi. Oppure, ad esempio, prendiamo l'archiviazione di array di dati nel database. Ci sono un sacco di opzioni diverse e Hibernate sa come lavorare con tutte:

Tipo di ibernazione (pacchetto org.hibernate.type) Tipo JDB tipo Java BasicTypeRegistr
tipo blob BLOB java.sql.blob blog, java.sql.blob
clobtype CLUB java.sql.clob clob, java.sql.clob
Tipo binario VARBINARIO byte[] binario, byte[]
BlobType materializzato BLOB byte[] materized_blob
Tipo di immagine LONGVARBINARIO byte[] Immagine
WrapperBinaryType VARBINARIO java.lang.Byte[] wrapper binario, Byte[], java.lang.Byte[]
CharArrayType VARCHAR carattere[] caratteri, char[]
CarattereArrayType VARCHAR java.lang.Carattere[] caratteri-involucro, Carattere[], java.lang.Character[]
UUIDBinaryType BINARIO java.util.UUID uuid-binario, java.util.UUID
Tipo di carattere UUID CHAR, può anche leggere VARCHAR java.util.UUID uuid-char
PostgreSQLUUIDType UUID PostgreSQL, tramite Types#OTHER, conforme alla definizione del driver JDBC PostgreSQL java.util.UUID pg-uuid
E dal rilascio di JDK 8, Hibernate ha aggiunto alcuni altri tipi relativi al tempo. Tutto per semplificarti la vita. Non devi più chiederti se tutti questi nuovi tipi sono supportati. I creatori di Hibernate hanno già aggiunto il loro supporto per te:
Tipo di ibernazione (pacchetto org.hibernate.type) Tipo JDB tipo Java BasicTypeRegistr
Tipo di durata BIGINT java.time.Durata Durata, java.time.Duration
tipo istantaneo TIMESTAMP java.time.Instant Istantaneo, java.time.Instant
LocalDateTimeType TIMESTAMP java.time.LocalDateTime LocalDateTime, java.time.LocalDateTime
LocalDateType DATA java.time.LocalDate LocalDate, java.time.LocalDate
LocalTimeType TEMPO java.time.LocalTime Ora locale, java.time.Ora locale
OffsetDateTimeType TIMESTAMP java.time.OffsetDateTime OffsetDateTime, java.time.OffsetDateTime
OffsetTimeType TEMPO java.time.OffsetTime OffsetTime, java.time.OffsetTime
OffsetTimeType TIMESTAMP java.time.ZonedDateTime ZonedDateTime, java.time.ZonedDateTime