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?

Chaitanya
fonte
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]

Ankur Singhal
fonte
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.

Avikool91
fonte
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.

Montaser Mahadi
fonte
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;
}
Ganesh Giri
fonte
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

Skryvets
fonte
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.

Arun Raaj
fonte
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.
Samim Hossain
fonte