Qual é a utilidade da anotação @Temporal no Hibernate?


101

A Documentação do Hibernate contém as informações abaixo para a @Temporalanotação:

Em APIs Java simples, a precisão temporal do tempo não é definida. Ao lidar com dados temporais, você pode desejar descrever a precisão esperada no banco de dados. Os dados temporais podem ter precisão de DATA, HORA ou TIMESTAMP (ou seja, a data real, apenas a hora ou ambos). Use a anotação @Temporal para ajustar isso.

O que isso temporal precision of time is not definedsignifica? O que são temporaldados e sua precisão? Como isso se ajusta?


3
Se você usar Calendar como sua propriedade Entity, em java simples ele imprime muitas informações que não são necessárias quando você deseja salvá-lo no banco de dados, por exemplo. Nesse caso, você pode ter algo como @Temporal (TemporalType.TIMESTAMP) Calendário de calendário em sua entidade para armazenar carimbo de data / hora em seu banco de dados ou apenas data ou apenas hora alterando para @Temporal (TemporalType.DATE) ou @Temporal (TemporalType.TIME) em sua propriedade de Calendário.
— user3487063

Respostas:


104

Essa anotação deve ser especificada para campos persistentes ou propriedades do tipo java.util.Datee java.util.Calendar. Ele só pode ser especificado para campos ou propriedades desses tipos.

A Temporalanotação pode ser usada em conjunto com a Basicanotação, a Idanotação ou a ElementCollectionanotação (quando o valor da coleção de elementos é de um tipo temporal.

Em APIs Java simples, a precisão temporal do tempo não é definida. Ao lidar com dados temporais, você pode desejar descrever a precisão esperada no banco de dados. Os dados temporais podem ter precisão de DATA, HORA ou TIMESTAMP (ou seja, a data real, apenas a hora ou ambos). Use a @Temporalanotação para fazer o ajuste fino.

Os dados temporais são os dados relacionados ao tempo. Por exemplo, em um sistema de gerenciamento de conteúdo, a data de criação e a data da última atualização de um artigo são dados temporais. Em alguns casos, os dados temporais precisam de precisão e você deseja armazenar data / hora precisa ou ambos ( TIMESTAMP) na tabela do banco de dados.

A precisão temporal não é especificada nas principais APIs Java. @Temporalé uma JPAanotação que se converte entre timestamp e java.util.Date. Ele também se converte time-stampem tempo. Por exemplo, no snippet abaixo, @Temporal(TemporalType.DATE) descarta o valor da hora e apenas preserva a data .

@Temporal(TemporalType.DATE)
private java.util.Date creationDate;

De acordo com os javadocs,

Anotação para declarar um {@code TemporalType} apropriado nos parâmetros do método de consulta. Observe que esta anotação só pode ser usada em parâmetros do tipo {@link Date} com padrãoTemporalType.DATE

[Informações acima coletadas de várias fontes]


Por que não posso usá-lo com o tipo Java Timestamp?
— powder366 de

3
Portanto, se você estiver usando apenas TemporalType.TIMESTAMP ... há algum sentido em usar essa anotação? As datas parecem funcionar bem para este fim sem isso ..
— Amalgovinus

como posso armazenar no banco de dados MySql no formato comoyyyy-MM-dd
— Shantaram Tupe

@shantaram_t isso pode ajudá-lo
— Ankur Singhal

1
Recebi a entrada: 02/10/2017e desejo convertê-la para 2017-10-02ou2017/10/02
— Shantaram Tupe

42

@Temporal é uma anotação JPA que pode ser usada para armazenar na tabela do banco de dados um dos seguintes itens de coluna:

  1. DATA ( java.sql.Date)
  2. TEMPO ( java.sql.Time)
  3. TIMESTAMP ( java.sql.Timestamp)

Geralmente, quando declaramos um Datecampo na classe e tentamos armazená-lo.
Ele será armazenado como TIMESTAMP no banco de dados.

@Temporal
private Date joinedDate;

O código acima armazenará o valor semelhante a 07/08/17 04: 33: 35.870000000 PM

Se quisermos armazenar apenas a DATA no banco de dados,
podemos usar / definir TemporalType.

@Temporal(TemporalType.DATE)
private Date joinedDate;

Desta vez, ele armazenaria 17/08/07 no banco de dados

Existem também alguns outros atributos @Temporalque podem ser usados ​​com base no requisito.


O valor padrão é TemporalType.DATE. Não tenho ideia de por que você forneceu um valor de atributo não anotado com parte do tempo.
— Simon Logic,

se duas datas forem iguais, o aspecto acima estará funcionando (TemporalType.DATE).
— Lova Chittumuri de

Não faça Copiar e Colar a resposta. stackoverflow.com/questions/25333711/…
— Lova Chittumuri

10

Tipos temporais são o conjunto de tipos baseados em tempo que podem ser usados ​​em mapeamentos de estado persistente.

A lista de tipos temporais suportados inclui os três java.sqltipos java.sql.Date, java.sql.Timee java.sql.Timestamp, e inclui os dois java.utiltipos java.util.Datee java.util.Calendar.

Os java.sqltipos são completamente descomplicados. Eles agem como qualquer outro tipo de mapeamento simples e não precisam de nenhuma consideração especial.

Os dois java.utiltipos precisam de metadados adicionais, no entanto, para indicar qual dos java.sqltipos JDBC usar ao se comunicar com o driver JDBC. Isso é feito anotando-os com a @Temporalanotação e especificando o tipo JDBC como um valor do TemporalTypetipo enumerado.

Existem três valores enumerados de DATE, TIME e TIMESTAMP para representar cada um dos java.sqltipos.


4

usa isto

@Temporal(TemporalType.TIMESTAMP)
@Column(name="create_date")
private Calendar createDate;

public Calendar getCreateDate() {
    return createDate;
}

public void setCreateDate(Calendar createDate) {
    this.createDate = createDate;
}

4

Se você está procurando uma resposta curta:

No caso de usar java.util.Date, Java realmente não sabe como se relacionar diretamente com os tipos SQL. É quando @Temporalentra em jogo. É usado para especificar o tipo de SQL desejado.

Fonte: Baeldung


3

Eu uso o Hibernate 5.2 e @Temporalnão é mais necessário.
java.util.date , sql.date , time.LocalDate são armazenados no banco de dados com o tipo de dados apropriado como data / carimbo de data / hora.


então qual é a solução se queremos apenas salvar os dados usando Hibernate 5.x
— Kms

Uso de Java 8 LocalDate
— Josh

1

Usamos a anotação @Temporal para inserir data, hora ou ambos na tabela do banco de dados. Usando TemporalType podemos inserir dados, hora ou ambos na tabela interna.

@Temporal(TemporalType.DATE) // insert date
@Temporal(TemporalType.TIME) // insert time
@Temporal(TemporalType.TIMESTAMP) // insert  both time and date.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.