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