Tipos de datos admitidos

Durante los tres niveles anteriores, nos familiarizamos un poco con Hibernate. Es hora de la segunda ronda. Ahora comenzaremos a estudiar lo mismo, solo que más profundo. Y comenzaremos mapeando los campos de la clase Entity a las columnas de las tablas en la base de datos.

Como ya sabe, el mapeo de un campo en una clase de entidad a una columna se realiza mediante la anotación @Column . Y ahora la pregunta es: ¿qué tipos de campos se pueden mapear con tal anotación?

Todos los tipos de datos en Java se pueden dividir en tres grupos:

  • El tipo es bastante simple y fácil de almacenar en una base de datos .
  • El tipo es complejo y necesita escribir un convertidor especial para él .
  • El tipo es muy complejo y necesita una tabla separada para almacenar sus valores .

Los tipos simples que Hibernate sabe cómo almacenar incluyen:

Tipos en Java paquete Ejemplos de clase
Tipos primitivos de Java booleano , int , doble , etc.
Envolturas sobre primitivas java.idioma Booleano , Entero , Doble , etc.
Instrumentos de cuerda java.idioma Cadena
Números "avanzados" java.matemáticas BigInteger y BigDecimal
fecha y hora java.tiempo LocalDate , LocalTime , LocalDateTime , OffsetTime , OffsetDateTime , Instant
Varias variaciones de fecha y hora. java.util fecha y calendario
Formatos antiguos de fecha y hora java.sql Fecha , Hora , Marca de tiempo
Matriz de bytes o caracteres byte[] o Byte[] , char[] o Carácter[]
Enumeraciones Cualquier enumeración
Objetos serializables Cualquier implementación de java.io.Serializable

Todos estos tipos tienen sus contrapartes en lenguaje SQL, por lo que Hibernate sabe cómo almacenarlos y cargarlos desde la base de datos.

Ejemplo:

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

Asignaciones de tipos manuales: anotación @Type

A veces, es posible que desee alterar la política de Hibernate y decirle explícitamente qué tipo de datos almacenar en la base de datos. Por ejemplo, tienes un campo en tu clase Entity de tipo Integer, pero en la base hay una columna para él de tipo VARCHAR.

Hay una anotación especial para esto: @Type . Parece muy simple:

@Type(type="type-name")

Por ejemplo, pidamos a Hibernate que haga el campoFecha de creaciónde nuestra clase de usuario se almacenó en la base de datos como una cadena:

@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 descubriera cómo convertir el tipo Fecha a su nuevo tipo, simplemente lo haría. Si no lo entiende, deberá especificar un convertidor de tipo especial. Pero más sobre eso más adelante.

Lista de tipos de Hibernate para bases de datos

Por cierto, ¿te diste cuenta de que especificamos el tipo org.hibernate.type.StringType , no String ? Esto se debe a que hemos elegido uno de los tipos soportados por el DBMS y no por el lenguaje Java. Cada uno tiene su propio sistema de tipos. Es solo que los desarrolladores de Hibernate propusieron nombres convenientes de estilo Java en lugar de estos VARCHAR.

Por cierto, esta lista no es tan pequeña. Voy a dar parte de ella aquí:

Tipo de Hibernate (paquete org.hibernate.type) tipo JDBC tipo Java Clave(s) BasicTypeRegistry
Tipo de cadena VARCHAR java.lang.cadena cadena, java.lang.cadena
clob materializado CLUB java.lang.cadena materializado_clob
tipo de texto LONGVARCHAR java.lang.cadena texto
tipo de caracter CARBONIZARSE char, java.lang.Carácter char, java.lang.Carácter
tipo booleano poco booleano, java.lang.Booleano booleano, java.lang.Booleano
NumericBooleanTypeNumericBooleanType ENTERO, 0 es falso, 1 es verdadero booleano, java.lang.Booleano numérico_booleano
SíNoTipo CARÁCTER, 'N'/'n' es falso, 'Y'/'y' es verdadero. El valor en mayúsculas se escribe en la base de datos. booleano, java.lang.Booleano sí No
VerdaderoFalsoTipo CHAR, 'F'/'f' es falso, 'T'/'t' es verdadero. El valor en mayúsculas se escribe en la base de datos. booleano, java.lang.Booleano verdadero Falso
tipo de byte TINYINT byte, java.lang.Byte byte, java.lang.Byte
tipo corto PEQUEÑO corto, java.lang.Corto corto, java.lang.Corto
tipos enteros ENTERO int, java.lang.Integer int, java.lang.Integer
tipo largo EMPEZANDO largo, java.lang.Largo largo, java.lang.Largo
tipo flotante FLOTAR flotante, java.lang.Float flotante, java.lang.Float
tipo doble DOBLE doble, java.lang.Doble doble, java.lang.Doble
BigIntegerType NUMÉRICO java.math.BigInteger big_integer, java.math.BigInteger
BigDecimalType NUMÉRICO java.math.BigDecimal big_decimal, java.math.bigDecimal
Tipo de marca de tiempo MARCA DE TIEMPO java.sql.timestamp marca de tiempo, java.sql.marca de tiempo
Tipo de tiempo TIEMPO java.sql.Tiempo tiempo, java.sql.Tiempo
tipo de fecha FECHA java.sql.fecha fecha, java.sql.fecha
Tipo de calendario MARCA DE TIEMPO java.util.Calendar calendario, java.util.Calendar
CalendarDateType FECHA java.util.Calendar calendario_fecha
Tipo de cambio monetario java.util.Currency VARCHAR moneda, java.util.Currency
LocaleType VARCHAR java.util.locale configuración regional, java.utility.locale
Tipo de zona horaria VARCHAR, usando la identificación de la zona horaria java.util.TimeZone zona horaria, java.util.TimeZone
Tipo de URL VARCHAR java.net.URL url, java.net.URL
tipo de clase VARCHAR(clase FQN) java.lang.Class clase, java.lang.Class

La mesa, por supuesto, es grande, pero muy útil. Por ejemplo, queda claro que el tipo booleano se puede almacenar en la base de datos en al menos seis formas diferentes. ¿No necesitas tanto? ¿Y quién dijo que tú eliges la forma de ahorrar?

No hay un tipo booleano en SQL y, a menudo, se almacena así:

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

Por lo tanto, es muy bueno cuando Hibernate comprende todos estos problemas. O, por ejemplo, tomemos el almacenamiento de matrices de datos en la base de datos. Hay un montón de opciones diferentes, e Hibernate sabe cómo trabajar con todas ellas:

Tipo de Hibernate (paquete org.hibernate.type) tipo JDBC tipo Java BasicTypeRegistr
tipo de gota GOTA java.sql.blob blog, java.sql.blob
tipo de clob CLUB java.sql.clob clob, java.sql.clob
BinaryType VARBINARIO byte[] binario, byte[]
MaterializedBlobType GOTA byte[] materized_blob
Tipo de imagen LONGVARBINARIO byte[] imagen
WrapperBinaryType VARBINARIO java.lang.Byte[] contenedor-binario, Byte[], java.lang.Byte[]
CharArrayType VARCHAR carbonizarse[] personajes, char[]
Tipo de matriz de caracteres VARCHAR java.lang.Carácter[] caracteres-envoltura, Carácter[], java.lang.Character[]
UUIDBinaryType BINARIO java.util.UUID uuid-binario, java.util.UUID
UUIDCharType CHAR, también puede leer VARCHAR java.util.UUID uuid-char
PostgreSQLUUIDTypePostgreSQLUUIDType UUID de PostgreSQL, a través de Types#OTHER, que cumple con la definición del controlador JDBC de PostgreSQL java.util.UUID pg-uuid
Y desde el lanzamiento de JDK 8, Hibernate ha agregado algunos tipos más relacionados con el tiempo. Todo para hacerte la vida más fácil. Ya no tiene que preguntarse si todos estos tipos novedosos son compatibles. Los creadores de Hibernate ya agregaron su apoyo para ti:
Tipo de Hibernate (paquete org.hibernate.type) tipo JDBC tipo Java BasicTypeRegistr
DuraciónTipo EMPEZANDO java.tiempo.Duración Duración, java.time.Duration
tipo instantáneo MARCA DE TIEMPO java.tiempo.instantáneo Instantáneo, java.time.Instant
LocalDateTimeType MARCA DE TIEMPO java.time.LocalDateTime LocalDateTime, java.time.LocalDateTime
Tipo de fecha local FECHA java.hora.FechaLocal LocalDate, java.time.LocalDate
Tipo de hora local TIEMPO java.hora.HoraLocal Hora local, java.hora.Horalocal
OffsetDateTimeType MARCA DE TIEMPO java.time.OffsetDateTime OffsetDateTime, java.time.OffsetDateTime
OffsetTimeType TIEMPO java.time.OffsetTime OffsetTime, java.time.OffsetTime
OffsetTimeType MARCA DE TIEMPO java.time.ZonedDateTime ZonedDateTime, java.time.ZonedDateTime