Tipos de dados compatíveis

Durante os três níveis anteriores, nos familiarizamos um pouco com o Hibernate. É hora do segundo turno. Agora vamos começar a estudar a mesma coisa, só que mais profundamente. E começaremos mapeando os campos da classe Entity para as colunas das tabelas do banco de dados.

Como você já sabe, o mapeamento de um campo em uma classe Entity para uma coluna é feito usando a anotação @Column . E agora a pergunta é: que tipos de campos podem ser mapeados com tal anotação?

Todos os tipos de dados em Java podem ser divididos em três grupos:

  • O tipo é bastante simples e fácil de armazenar em um banco de dados .
  • O tipo é complexo e você precisa escrever um conversor especial para ele .
  • O tipo é muito complexo e precisa de uma tabela separada para armazenar seus valores .

Tipos simples que o Hibernate sabe como armazenar incluem:

Tipos em Java pacote Exemplos de aulas
Tipos Java Primitivos booleano , int , duplo , etc.
Wrappers sobre primitivos java.lang Boolean , Integer , Double , etc.
Cordas java.lang Corda
Números "avançados" java.math BigInteger e BigDecimal
data e hora java.time LocalDate , LocalTime , LocalDateTime , OffsetTime , OffsetDateTime , Instantâneo
Várias variações de data e hora java.util data e calendário
Formatos antigos de data e hora java.sql Data , hora , carimbo de data/hora
Matriz de bytes ou caracteres byte[] ou Byte[] , char[] ou Character[]
Enums Qualquer enumeração
objetos serializáveis Qualquer implementação de java.io.Serializable

Todos esses tipos têm suas contrapartes na linguagem SQL, então o Hibernate sabe como armazená-los e carregá-los do banco de dados.

Exemplo:

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

Atribuições manuais de tipo - anotação @Type

Às vezes, você pode querer adulterar a política do Hibernate e dizer explicitamente qual tipo de dados armazenar no banco de dados. Por exemplo, você tem um campo em sua classe Entity do tipo Integer, mas na base existe uma coluna para ele com o tipo VARCHAR.

Existe uma anotação especial para isso - @Type . Parece muito simples:

@Type(type="type-name")

Vamos, por exemplo, pedir ao Hibernate para fazer o campoData de criaçãoda nossa classe User foi armazenado no banco de dados como uma string:

@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 o Hibernate descobrisse como converter o tipo Date para o seu novo tipo, ele o faria. Se não entender, você precisará especificar um conversor de tipo especial. Mas mais sobre isso mais tarde.

Lista de tipos de Hibernate para bancos de dados

A propósito, você notou que especificamos o tipo org.hibernate.type.StringType , não String . Isso porque escolhemos um dos tipos suportados pelo SGBD e não pela linguagem Java. Cada um deles tem seu próprio sistema de tipos. Acontece que os desenvolvedores do Hibernate criaram nomes convenientes no estilo Java em vez desses VARCHARs.

By the way, esta lista não é tão pequena. Vou dar parte dela aqui:

Tipo de Hibernate (pacote org.hibernate.type) tipo JDBC tipo Java Chave(s) BasicTypeRegistry
StringType VARCHAR java.lang.string string, java.lang.string
palha materializada CLOB java.lang.string materialized_clob
Tipo de texto LONGVARCHAR java.lang.string texto
tipo de personagem CARACTERES char, java.lang.Character char, java.lang.Character
BooleanType pedaço booleano, java.lang.Booleano booleano, java.lang.Booleano
NuméricoBooleanoTipo INTEGER, 0 é falso, 1 é verdadeiro booleano, java.lang.Booleano numérico_booleano
SimNãoTipo CHAR, 'N'/'n' é falso, 'Y'/'y' é verdadeiro. O valor em maiúsculas é gravado no banco de dados. booleano, java.lang.Booleano sim não
TrueFalseType CHAR, 'F'/'f' é falso, 'T'/'t' é verdadeiro. O valor em maiúsculas é gravado no banco de dados. booleano, java.lang.Booleano verdadeiro falso
ByteType TINYINT byte, java.lang.Byte byte, java.lang.Byte
tipo curto SMALLINT curto, java.lang.Short curto, java.lang.Short
Tipos inteiros INTEIRO int, java.lang.Integer int, java.lang.Integer
tipo longo BIGINT longo, java.lang.Long longo, java.lang.Long
tipo flutuante FLUTUADOR flutuante, java.lang.Float flutuante, java.lang.Float
tipo duplo DOBRO duplo, java.lang.Double duplo, java.lang.Double
BigIntegerType NUMÉRICO java.math.BigInteger big_integer, java.math.BigInteger
BigDecimalType NUMÉRICO java.math.BigDecimal big_decimal, java.math.bigDecimal
Tipo de carimbo de data/hora TIMESTAMP java.sql.timestamp timestamp, java.sql.timestamp
Tipo de hora TEMPO java.sql.Time hora, java.sql.Hora
tipo de data DATA java.sql.date data, java.sql.data
CalendarType TIMESTAMP java.util.Calendar calendário, java.util.Calendar
CalendárioDataTipo DATA java.util.Calendar data_calendário
Tipo de Moeda java.util.Currency VARCHAR moeda, java.util.Currency
LocaleType VARCHAR java.util.locale localidade, java.utility.locale
TimeZoneType VARCHAR, usando o ID do fuso horário java.util.TimeZone fuso horário, java.util.TimeZone
UrlType VARCHAR java.net.URL url, java.net.URL
tipo de classe VARCHAR(classe FQN) java.lang.Class classe, java.lang.Class

A mesa, claro, é grande, mas muito útil. Por exemplo, fica claro que o tipo booleano pode ser armazenado no banco de dados de pelo menos seis maneiras diferentes. Você não precisa de tanto? E quem disse que você escolhe o jeito de economizar?

Não há nenhum tipo booleano no SQL e geralmente é armazenado assim:

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

Portanto, é muito bom quando o Hibernate entende todos esses problemas. Ou, por exemplo, vamos pegar o armazenamento de arrays de dados no banco de dados. Existem várias opções diferentes e o Hibernate sabe como trabalhar com todas elas:

Tipo de Hibernate (pacote org.hibernate.type) tipo JDBC tipo Java BasicTypeRegistr
tipo de blob BLOB java.sql.blob blog, java.sql.blob
clobtype CLOB java.sql.clob clob, java.sql.clob
Tipo Binário VARBINÁRIO byte[] binário, byte[]
MaterializedBlobType BLOB byte[] materized_blob
Tipo de imagem LONGVARBINARY byte[] imagem
WrapperBinaryType VARBINÁRIO java.lang.Byte[] wrapper-binary, Byte[], java.lang.Byte[]
CharArrayType VARCHAR Caracteres[] personagens, char[]
CharacterArrayType VARCHAR java.lang.Character[] caracteres wrapper, Character[], java.lang.Character[]
UUIDBinaryType BINÁRIO java.util.UUID uuid-binary, java.util.UUID
UUIDCharType CHAR, também pode ler VARCHAR java.util.UUID uuid-char
PostgreSQLUUIDType PostgreSQL UUID, através de Types#OTHER, que está em conformidade com a definição do driver PostgreSQL JDBC java.util.UUID pg-uuid
E desde o lançamento do JDK 8, o Hibernate adicionou mais alguns tipos relacionados ao tempo. Tudo para facilitar sua vida. Você não precisa mais se perguntar se todos esses novos tipos são suportados. Os criadores do Hibernate já adicionaram suporte para você:
Tipo de Hibernate (pacote org.hibernate.type) tipo JDBC tipo Java BasicTypeRegistr
DuraçãoTipo BIGINT java.time.Duration Duração, java.time.Duration
tipo instantâneo TIMESTAMP java.time.Instant Instantâneo, 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 LocalTime, java.time.LocalTime
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