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 |
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 |
GO TO FULL VERSION