sexta-feira, 3 de agosto de 2018

Conversores JPA

Introdução

A JPA possui um recurso para criar conversores JPA, sendo um facilitador para converter qualquer tipo de objeto, ENUM. O JARCH possui alguns conversores que facilita a gravação de alguns tipos.

Exemplos

Nesse post vou mostrar como usar os conversores JPA. O JARCH possui alguns conversores JPA para a nova API de datas, boolean, etc. Existe duas formas de utilizar esses conversores, colocando o conversor através da anotação @Convert ou registrando os conversores no persistence.xml.
Segue um exemplo abaixo usando a declaração via anotação:
1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
package br.com.arch.arquitetura.crud.tudo;

import br.com.jarch.crud.entity.CrudMultiTenantEntity;
import br.com.jarch.jpa.converter.LocalDateJpaConverter;
import br.com.jarc.jpa.converter.LocalDateTimeJpaConverter;
import br.com.jarch.jpa.converter.LocalTimeJpaConverter;
import br.com.jarch.jpa.converter.YearMonthJpaConverter;
import br.com.jarch.jpa.converter.br.BooleanSNJpaConverter;
import org.hibernate.envers.Audited;

import javax.persistence.Column;
import javax.persistence.Convert;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.YearMonth;

@Audited
@Table(name = "tb_tudo")
@Entity(name = "tudo")
@SequenceGenerator(name = "TudoIdSequence", sequenceName = "sq_idtudo", allocationSize = 1)
public class TudoEntity extends CrudMultiTenantEntity {

 @Id
 @GeneratedValue(strategy = GenerationType.AUTO, generator = "TudoIdSequence")
 @Column(name = "id_tudo")
 private Long id;

 @Column(name = "dt_tudo")
 @Convert(converter = LocalDateJpaConverter.class)
 private LocalDate data;

 @Column(name = "dh_tudo")
 @Convert(converter = LocalDateTimeJpaConverter.class)
 private LocalDateTime dataHora;

 @Column(name = "hr_tudo")
 @Convert(converter = LocalTimeJpaConverter.class)
 private LocalTime hora;

 @Column(name = "am_competencia", length = 7)
 @Convert(converter = YearMonthJpaConverter.class)
 private YearMonth competencia;

 @Column(name = "sn_tudo")
 @Convert(converter = BooleanSNJpaConverter.class)
 private Boolean simNao;

 @Override
 public Long getId() {
  return id;
 }

 @Override
 public void setId(Long id) {
  this.id = id;
 }

 public LocalDate getData() {
  return data;
 }

 public void setData(LocalDate data) {
  this.data = data;
 }

 public LocalDateTime getDataHora() {
  return dataHora;
 }

 public void setDataHora(LocalDateTime dataHora) {
  this.dataHora = dataHora;
 }

 public LocalTime getHora() {
  return hora;
 }

 public void setHora(LocalTime hora) {
  this.hora = hora;
 }

 public YearMonth getCompetencia() {
  return competencia;
 }

 public void setCompetencia(YearMonth competencia) {
  this.competencia = competencia;
 }

 public Boolean getSimNao() {
  return simNao;
 }

 public void setSimNao(Boolean simNao) {
  this.simNao = simNao;
 }
}

Analisando o código anterior notamos a utilização da anotação @Convert usando o conversor do JARCH.
A outra maneira de utilização seria registrar os conversores no persistence.xml. Dessa maneira todos os campos de uma Entity que obtiverem os conversores registrados já terá o conversor implicitamente.
Segue um exemplo abaixo declarando os conversores no persistence.xml:

1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             version="2.1"
             xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="arquiteturaweb-pu" transaction-type="JTA">
        <jta-data-source>java:/ds/arquitetura/postgresql</jta-data-source>
        <class>com.arch.jpa.converter.LocalDateJpaConverter</class>
        <class>com.arch.jpa.converter.LocalDateTimeJpaConverter</class>
        <class>com.arch.jpa.converter.LocalTimeJpaConverter</class>
        <class>com.arch.jpa.converter.YearMonthJpaConverter</class>
        <class>com.arch.jpa.converter.br.BooleanSNJpaConverter</class>
        <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>

        <!-- <exclude-unlisted-classes>false</exclude-unlisted-classes> -->
        <properties>

No código anterior as linhas com as tags declara os conversores, mas ainda existe uma outra forma de declarar todos os conversores sem ficar especificando um a um.
Segue o persistence.xml abaixo com a declaração de todos os conversores sem especificar um a um:

1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             version="2.1"
             xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="arquiteturaweb-pu" transaction-type="JTA">
        <jta-data-source>java:/ds/arquitetura/postgresql</jta-data-source>

        <jar-file>lib/jarch-framework-18.7.1.jar</jar-file>

        <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>

        <!-- <exclude-unlisted-classes>false</exclude-unlisted-classes> -->
        <properties>

Conclusão

Com esses conversores disponíveis o uso da nova API de datas ficou mais fácil, tornando transparente a migração do antigo Date.

Até mais,


Nenhum comentário:

Postar um comentário

Versão 23.3.0-Final

      Introdução Nesse post vou mostrar as principais novidades da versão 23.3.0, algumas correções e pequenas alterações. Alterações Além d...