JPA Mapeando Datas (Date) e Enum

Bom dia, tudo bem?

Hoje vamos ver sobre como mapear atributo (s) do tipo Date (java.util.Date) ou Enum.

Muitas pessoas ao ouvirem a palavra “data” em Java já têm uma parada cardíaca. As APIs que tratam sobre data podem ser um pouco confusas no começo.

Felizmente encontramos uma boa solução quando falamos de mapear data em JPA. A anotação @Temporal nos permite mapear 3 opções:

  • Apenas data.
  • Apenas hora.
  • Data e Hora.

Veja como ficaria seu código:

@Temporal(value=TemporalType.DATE)
private Date onlyDate;

@Temporal(value=TemporalType.TIME)
private Date onlyTime;

@Temporal(value=TemporalType.TIMESTAMP)
private Date dateAndTime;

Fica bem simples salvar data desse modo. Você pode escolher qual o tipo de informação salvar apenas pela anotação.

E para mapear um Enum é mais simples ainda. Para mapear um Enum em JPA basta colocar conforme o código abaixo:

@Enumerated
private Enum vaules;

@Enumerated(value=EnumType.STRING)
private Enum vauleAsString;

@Enumerated(value=EnumType.ORDINAL)
private Enum vauleAsNumber;

Você pode optar por deixar a anotação @Enumerated sem parâmetro algum, ou então pode definir seu Enum como: String ou Ordinal (numérico).

Caso sua tabela não seja grande seria uma boa idéia colocar como String. É muito mais fácil identificar status = OK ou NOK do que identificar que status = 1 é (status = OK).

Mas lembre-se de que, uma consulta de String custa mais processamento ao banco de dados do que uma consulta por número inteiro, se sua tabela for grande considere ter o status (ou qualquer outra coluna de Enum) como numero e ter uma tabela onde todos esses valores são listados.

Uma outra solução (menos elegante) seria ter as 2 colunas na mesma tabela, com código status = 1 e descrição status_type = ‘OK’.

Espero que esse pequeno post de hoje possa ter te ajudado.

Dúvida/Sugestões/Críticas basta colocar.

Até a próxima.

10 thoughts on “JPA Mapeando Datas (Date) e Enum

    • Lázaro, boa tarde.

      Esse post foi pouca explicação e muita ação.

      Não existe muito o que falar sobre esses mapeamentos.

      Obrigado pela visita e pelo apoio. [=

  1. parabens! ótimo post! dificil de encontrar mas valeu a pena =D…

    A propósito.. pra que serve o Enumerated??? (sou novado, por favor não leve em conta a ignorancia… =)

    • Justamente para indicar que o valor a ser salvo é um ENUM. Ele persistirá o valor e quando buscar o valor do banco de dados ele convertera o valor automaticamente.

      Obrigado pelo apoio. =D

  2. Use ENUM no BD em vez de String, Ocupa o espaço de um TinyInt e evita que sejam guardadas strings aleatórias por incautos que venham dar manutenção no sistema mais tarde.. Além disso, crie um enum Java para administrar esses valores

    • Carlos, boa noite.

      É uma solução mais complexa. No caso, estou mostrando o modo mais simples.

      Obrigado pela dica e vai ficar registrado aqui para quem quiser outros modos de fazer. [=

  3. Muito util este post. Me ajudou muito. Estava com problemas ao salvar java.util.Date com as informações de time, agora ficou tudo numa boa. Valeu!!!

    • Fernando, boa tarde.

      Me desculpe a demora, estive muito ocupado nesse último mês.

      Fico feliz em receber um bom feedback, realmente é muito bom poder compartilhar o pouco que eu sei. (:

      Obrigado por tudo e desculpe a demora.

Leave a Comment