Types de données pris en charge
Au cours des trois niveaux précédents, nous nous sommes un peu familiarisés avec Hibernate. C'est l'heure du second tour. Nous allons maintenant commencer à étudier la même chose, mais plus en profondeur. Et nous commencerons par mapper les champs de la classe Entity aux colonnes des tables de la base de données.
Comme vous le savez déjà, le mappage d'un champ dans une classe Entity à une colonne se fait à l'aide de l' annotation @Column . Et maintenant la question est : quels types de champs peuvent être cartographiés avec une telle annotation ?
Tous les types de données en Java peuvent être divisés en trois groupes :
- Le type est assez simple et facile à stocker dans une base de données .
- Le type est complexe et vous devez lui écrire un convertisseur spécial .
- Le type est très complexe et nécessite une table séparée pour stocker ses valeurs .
Les types simples qu'Hibernate sait stocker incluent :
Types en Java | emballer | Exemples de classe |
---|---|---|
Types Java primitifs | booléen , int , double , etc. | |
Enveloppes sur les primitives | java.lang | Booléen , Entier , Double , etc. |
Cordes | java.lang | Chaîne |
Numéros "avancés" | java.math | BigInteger et BigDecimal |
date et l'heure | java.time | Date Locale , Heure Locale , Date Heure Locale , Heure Décalée , Date Heure Décalée , Instantané |
Diverses variations de date et d'heure | java.util | date et calendrier |
Anciens formats de date et d'heure | java.sql | Date , Heure , Horodatage |
Tableau d'octets ou de caractères | byte[] ou Byte[] , char[] ou Character[] | |
Énumérations | N'importe quelle énumération | |
Objets sérialisables | Toute implémentation de java.io.Serializable |
Tous ces types ont leurs homologues dans le langage SQL, donc Hibernate sait comment les stocker et les charger à partir de la base de données.
Exemple:
@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;
}
Attribution de type manuelle - Annotation @Type
Parfois, vous voudrez peut-être altérer la politique d'Hibernate et lui dire explicitement quel type stocker les données dans la base de données. Par exemple, vous avez un champ dans votre classe Entity de type Integer, mais dans la base, il y a une colonne pour celui-ci avec le type VARCHAR.
Il y a une annotation spéciale pour cela - @Type . Ça a l'air très simple :
@Type(type="type-name")
Par exemple, demandons à Hibernate de rendre le champdate de créationde notre classe User a été stocké dans la base de données sous forme de chaîne :
@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;
}
Si Hibernate découvrait comment convertir le type Date en votre nouveau type, il le ferait tout simplement. S'il ne comprend pas, vous devrez spécifier un convertisseur de type spécial. Mais plus là-dessus plus tard.
Liste des types Hibernate pour les bases de données
Au fait, avez-vous remarqué que nous avons spécifié le type org.hibernate.type.StringType , et non String . En effet, nous avons choisi l'un des types supportés par le SGBD et non par le langage Java. Ils ont chacun leur propre système de type. C'est juste que les développeurs d'Hibernate ont proposé des noms pratiques de style Java au lieu de ces VARCHAR.
Soit dit en passant, cette liste n'est pas si petite. Je vais en donner une partie ici:
Type d'hibernation (paquet org.hibernate.type) | Type JDBC | TypeJava | Clé(s) BasicTypeRegistry |
---|---|---|---|
StringType | VARCHAR | java.lang.string | chaîne, java.lang.string |
clob matérialisé | CLOB | java.lang.string | matérialisé_clob |
Type de texte | LONGVARCHAR | java.lang.string | texte |
type de caractère | CARBONISER | caractère, java.lang.Character | caractère, java.lang.Character |
BooléenType | bit | booléen, java.lang.Booléen | booléen, java.lang.Booléen |
NumericBooleanType | ENTIER, 0 est faux, 1 est vrai | booléen, java.lang.Booléen | numeric_boolean |
OuiNonType | CHAR, 'N'/'n' est faux, 'Y'/'y' est vrai. La valeur en majuscule est écrite dans la base de données. | booléen, java.lang.Booléen | Oui Non |
VraiFauxType | CHAR, 'F'/'f' est faux, 'T'/'t' est vrai. La valeur en majuscule est écrite dans la base de données. | booléen, java.lang.Booléen | vrai faux |
Type d'octet | TINYINT | octet, java.lang.Byte | octet, java.lang.Byte |
type court | PETITINT | court, java.lang.Short | court, java.lang.Short |
Types d'entiers | ENTIER | int, java.lang.Integer | int, java.lang.Integer |
type long | BIGINT | long, java.lang.Long | long, java.lang.Long |
flotteur | FLOTTER | flottant, java.lang.Float | flottant, java.lang.Float |
type double | DOUBLE | double, java.lang.Double | double, java.lang.Double |
BigIntegerType | NUMÉRIQUE | java.math.BigInteger | grand_entier, java.math.BigInteger |
BigDecimalType | NUMÉRIQUE | java.math.BigDecimal | big_decimal, java.math.bigDecimal |
Type d'horodatage | HORODATAGE | java.sql.horodatage | horodatage, java.sql.horodatage |
Type d'heure | TEMPS | java.sql.Heure | temps, java.sql.Time |
type de date | DATE | java.sql.date | date, java.sql.date |
Type de calendrier | HORODATAGE | java.util.Calendar | calendrier, java.util.Calendar |
CalendarDateType | DATE | java.util.Calendar | date_calendrier |
Type de devise | java.util.Currency | VARCHAR | devise, java.util.Currency |
Type de paramètres régionaux | VARCHAR | java.util.locale | locale, java.utility.locale |
Type de fuseau horaire | VARCHAR, en utilisant l'ID de fuseau horaire | java.util.TimeZone | fuseau horaire, java.util.TimeZone |
Type d'URL | VARCHAR | java.net.URL | URL, java.net.URL |
type de classe | VARCHAR (nom de domaine complet de classe) | java.lang.Class | classe, java.lang.Class |
La table, bien sûr, est grande, mais très utile. Par exemple, il en ressort clairement que le type booléen peut être stocké dans la base de données d'au moins six manières différentes. Vous n'avez pas besoin de tant que ça ? Et qui a dit que vous choisissiez la manière d'économiser ?
Il n'y a pas de type booléen en SQL et il est souvent stocké comme ceci :
- 1 ou 0
- 'F' ou 'T'
- 'O' ou 'N'
Par conséquent, c'est très bien quand Hibernate comprend tous ces problèmes. Ou, par exemple, prenons le stockage des tableaux de données dans la base de données. Il existe un tas d'options différentes, et Hibernate sait comment travailler avec toutes :
Type d'hibernation (paquet org.hibernate.type) | Type JDBC | TypeJava | BasicTypeRegistrBasicTypeRegistr |
---|---|---|---|
type de goutte | GOUTTE | java.sql.blob | blog, java.sql.blob |
type de clob | CLOB | java.sql.clob | clob, java.sql.clob |
TypeBinaire | VARBINAIRE | octet[] | binaire, octet[] |
MaterializedBlobType | GOUTTE | octet[] | matérialisé_blob |
Type d'image | LONGVARBINAIRE | octet[] | image |
WrapperBinaryType | VARBINAIRE | java.lang.Byte[] | wrapper-binary, Byte[], java.lang.Byte[] |
CharArrayType | VARCHAR | carboniser[] | caractères, caractère[] |
Type de tableau de caractères | VARCHAR | java.lang.Character[] | wrapper-characters, Character[], java.lang.Character[] |
UUIDBinaryTypeUUIDBinaryType | BINAIRE | java.util.UUID | uuid-binaire, java.util.UUID |
UUIDCharTypeUUIDCharType | CHAR, peut également lire VARCHAR | java.util.UUID | uuid-char |
PostgreSQLUUIDTypePostgreSQLUUIDType | PostgreSQL UUID, via Types#OTHER, qui est conforme à la définition du pilote PostgreSQL JDBC | java.util.UUID | pg-uuid |
Type d'hibernation (paquet org.hibernate.type) | Type JDBC | TypeJava | BasicTypeRegistrBasicTypeRegistr |
---|---|---|---|
DuréeType | BIGINT | java.time.Duration | Durée, java.time.Duration |
type instantané | HORODATAGE | java.time.Instant | Instantané, java.time.Instant |
LocalDateHeureType | HORODATAGE | java.time.LocalDateTime | LocalDateTime, java.time.LocalDateTime |
TypeDateLocal | DATE | java.time.LocalDate | LocalDate, java.time.LocalDate |
TypeHeureLocal | TEMPS | java.time.LocalTime | LocalTime, java.time.LocalTime |
DécalageDateHeureType | HORODATAGE | java.time.OffsetDateTime | OffsetDateTime, java.time.OffsetDateTime |
DécalageHeureType | TEMPS | java.time.OffsetTime | OffsetTime, java.time.OffsetTime |
DécalageHeureType | HORODATAGE | java.time.ZonedDateTime | ZonedDateTime, java.time.ZonedDateTime |
GO TO FULL VERSION