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
Et depuis la sortie de JDK 8, Hibernate a ajouté quelques types supplémentaires liés au temps. Tout pour vous faciliter la vie. Vous n'avez plus à vous demander si tous ces nouveaux types sont pris en charge. Les créateurs d'Hibernate ont déjà ajouté leur support pour vous :
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