segunda-feira, 11 de dezembro de 2017

Salvando LocalDate e LocalDateTime com JPA 2.1

Quando o JPA 2.1 foi lançado o Java 8 ainda não tinha saído, então algumas features ficaram prejudicadas. Porém para nossa felicidade, o JPA 2.1 tem conversores que nos permitem dizer ao JPA como mapear tipos de dados. A seguir vou mostrar como mapear então o LocalDate e o LocalDateTime:

@Entity
public class Pedido {

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "id", updatable = false, nullable = false)
        private Long id;
       
        @Column
        private LocalDate dataPrevisaoEntrega;
       
        @Column
        private LocalDateTime dataPedido;
       
        ...
       
}

          Um conversor deve implementar a interface javax.persistence.AttributeConverter<X,Y>, passando a classe da entidade em X e classe do banco de dados em Y. O conversor também precisa ser anotado com javax.persistence.Converter. Seguem os conversores:

@Converter(autoApply = true)
public class LocalDateConverter implements AttributeConverter<LocalDate, Date> {
       
    @Override
    public Date convertToDatabaseColumn(LocalDate localDate) {
        return (localDate == null ? null : Date.valueOf(localDate));
    }

    @Override
    public LocalDate convertToEntityAttribute(Date sqlDate) {
        return (sqlDate == null ? null : sqlDate.toLocalDate());
    }
}

@Converter(autoApply = true)
public class LocalDateTimeConverter implements AttributeConverter<LocalDateTime, Timestamp> {
       
    @Override
    public Timestamp convertToDatabaseColumn(LocalDateTime localDateTime) {
        return (localDateTime == null ? null : Timestamp.valueOf(localDateTime));
    }

    @Override
    public LocalDateTime convertToEntityAttribute(Timestamp sqlTimestamp) {
        return (sqlTimestamp == null ? null : sqlTimestamp.toLocalDateTime());
    }
}
         
          Perceba que na anotação @Converter foi passado o atributo autoApplay=true. Isso faz com que o conversor seja aplicado automaticamente em todos os casos. Quando esse atributo é falso, você fica responsável por informar ao JPA sempre que desejar usá-lo, anotando a propriedade com @Convert e passando a classe do conversor como segue:

@Column
@Convert(Converter = LocalDateConverter.class)
private LocalDate dataPrevisaoEntrega;

          Pronto, podemos trabalhar com as novas classes do Java 8 de forma simples e prática. Vou compartilhar um site muito bom para quem quer se aprofundar no JPA e no qual me baseei para este artigo:

Nenhum comentário:

Postar um comentário