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