Pós-Graduação em Desenvolvimento Full Stack – Fac. Delta
Prof. Átilla Barros - @atilla8huno
 Entity
 Classes que possuem atributos e relacionamentos
 Persistability
 São persistidas e seu estado representa um registro no banco de dados (BD)
 Identity
 Possuem uma chave única que diferencia o objeto de outros e são representados no BD
 Transactionality
 Entidades são criadas, atualizadas e excluídas em um contexto transacional no BD
 Granularity
 Objeto simples que possui atributos armazenados em um único lugar
 Entity Metadata
 Toda entidade devem ter seu mapeamento feito (XML ou Annotation)
 XML sobrescreve o mapeamento redundante feito via anotação
 Toda entidade deve ter um construtor vazio
 Para o correto comportamento é necessário implementar equals e hashCode
 Classe simples
 Entidade
 Entity Manager
 API invocada antes da entidade ser persistida
 Várias chamadas à API é necessária para executar várias ações no BD
 Interface javax.persistence.EntityManager
 Um provider é quem faz a implementação da JPA (Hibernate, EclipseLink, etc)
 Managed Entity
 O EntityManager possui um escopo de entidades gerenciadas (Persistence Context)
 Só é possível executar ações em entidades gerenciadas
 Apenas uma instância com o mesmo ID fica no escopo
 Uma entidade é gerenciada quando é lida do banco ou passada por argumento em alguma
chamada de método do EntityManager
 Entity Manager Factory
 Todo EntityManager é criado a partir de uma fábrica de objetos
 EntityManager é a representação de uma unidade de persistência (PU)
 Uma única instância da factory por PU
 Persistence Unit
 Configurações e classes
 PUs são nomeadas para identificação na factory
 Persistence Unit
 Uma unidade de persistência é configurada no arquivo persistence.xml
 O arquivo persistence.xml deve ficar no diretório META-INF
 Fork do repositório
 https://github.com/atilla8huno/jpa-seed
 Clone da fork
 Execute o comando abaixo em seu workspace
 git clone https://github.com/suaContaGitHub/jpa-seed
 Baixe as dependências
 Execute o comando abaixo no diretório do projeto
 mvn clean install
 Importe o projeto na IDE Eclipse
 File > Import > Existing Maven Projects > Next > Root Directory > Finish
 @Test
 Usado em métodos public void, non-static
 Indica que o método é uma unidade de teste
 @Test(expected = Exception.class)
 Indica que a unidade de teste espera que seja lançada uma exceção
 @Before
 Indica que o método será executado antes de cada teste da classe
 @After
 Indica que o método será executado depois de cada teste da classe
 @AfterClass
 Indica que o método será executado após toda a execução da classe
 Usado em métodos static
 import static org.junit.Assert.*;
 Importa todas as funções de verificação sem a necessidade de instância
 assertFalse(“comentário", expressão);
 Usado para verificar se determinada expressão é falsa
 assertTrue(“comentário", expressão);
 Usado para verificar se determinada expressão é verdadeira
 assertNull(“comentário", objeto);
 Usado para verificar se determinado objeto é null
 assertNotNull(“comentário", objeto);
 Usado para verificar se determinado objeto é diferente de null
 fail(“comentário");
 Usado para falhar o teste caso a execução do método chegue até aquele ponto
 Testamos se o EntityManager é instânciado antes de cada execução
 Testamos se o escopo do EntityManager é fechado depois de cada execução
 Testamos se o EntityManager consegue abrir uma nova transação
 Anotação usada para mapear classes que herdadas por entidades
 Anotação usada para mapear atributo de versionamento (Optimistic Locking)
 Usado sempre que precisar saber se a entidade já foi persistida ou é nova
 Usado para definir detalhes da tabela do BD que a entidade representará
 @Id
 Usado para mapear a chave primária da entidade
 Pode ser usada em tipos primitivos, wrappers e classes
 Faz uso do equals e hashCode
 @GeneratedValue
 Usado para mapear um gerador de valores para a chave primária
 strategy = GenerationType.AUTO, IDENTITY, SEQUENCE ou TABLE
 Usada para detalhar a coluna que o atributo representa
 @Temporal
 Usada para mapear campos Date, Time e DateTime
 @Basic
 Usada para especificar se a coluna é NULL ou NOT NULL
 Usada também para especificar o carregamento do atributo ao consultar (LAZY e EAGER)
 Usada para mapear um relacionamento de muitos-para-um ou um-para-um
 Pode-se especificar os atributos:
 fetch – diz se o relacionamento será ou não carregado após consulta da entidade
 cascade – diz se o relacionamento sofrerá as mesmas ações de persistência que a entidade
 option – diz se a respectiva coluna do relacionado é definida como NULL ou NOT NULL
 targetEntity – especifica a classe da entidade em caso de mapear uma classe mais genérica
 @OneToOne
 mappedBy – usado para mapear um relacionamentos bi-direcionais; é usado no lado fraco
do relacionamento; o atributo recebe uma String com o nome do objeto no lado forte
 orphanRemoval – excluir ou não registros lixo após desfazer um relacionamento
 Usada para especificar detalhes sobre a coluna da Foreign Key
 Usada para mapear um relacionamento um-para-muitos
 Ex: um Cliente possui várias Vendas
 Usada, geralmente, para mapear o lado fraco de um relacionamento bi-direcional
 Possui os mesmos atributos da anotação @OneToOne
 Usada para mapear um relacionamento muitos-pra-muitos
 Ex: Uma Venda possui vários Produtos; um Produto pode ser vendido várias vezes;
 Os atributos da anotação se assemelham à anotação @OneToOne
 Usada para detalhar a tabela de junção dos relacionamentos @*ToMany
 Possui os atributos da anotação @Table
 Mais os atributos:
 foreignKey – especifica o nome da constraint FK de um dos lados do relacionamento
 inverseForeignKey –nome da constraint FK do outro lado do relacionamento
 joinColumns – mapear detalhes da coluna da FK de um dos lados do relacionamento
 inverseJoinColumns – mapear detalhes da coluna da FK do outro lado do relacionamento
 Uso das duas anotações em conjunto para mapear muitos-pra-muitos
 A primeira unidade testará o método persist do EntityManager
 A unidade testará o método createQuery do EntityManager
 A unidade testará o método merge do EntityManager
 A unidade testará os métodos find e remove do EntityManager e a função MAX
 A unidade testará a execução da BATCH UPDATE/DELETE do EntityManager
 A unidade testará o método persist do EntityManager
 A unidade testará a consulta de um campo específico com filtro na query
 A unidade testará a consulta com Constructor Expression
 A unidade testará a consulta de vários atributos distintos
 A unidade testará a função COUNT da JPQL
 A unidade testará o método getSingleResult quando há vários registros no retorno
 A unidade testará o método getSingleResult quando não há registros no retorno
 A unidade testará o carregamento LAZY do EntityManager
 A unidade testará o carregamento LAZY e a função detach do EntityManager
 Builders úteis
 A unidade testará a persistência de atributos mapeados com CascadeType.PERSIST
 A unidade testará a o merge sem CascadeType.MERGE mapeado
 A unidade testará a consulta fazendo JOIN nos relacionamentos (Parte I)
 A unidade testará a consulta fazendo JOIN nos relacionamentos (Parte II)
 Grupo Spring Boot com Tomcat Embedded
 Grupo Java EE com Wildfly
 Grupo CDI com Tomcat
 Modelar no mínimo seis entidades e os relacionamentos;
 Duas entidades devem possuir chave primária composta;
 Duas entidades devem possuir mapeamento de Enum;
 Uma entidade deve ter mapeado um atributo Embedded;
 Uma entidade deve ter mapeado um atributo Map;
 Deve ser criado uma entidade base genérica, usada como superclass das entidades;
 Duas entidades devem sobrescrever o atributo version da entidade base;
 Criar APIs de CRUD para cada entidade;
 Controle transacional deve ser feito via anotação (automática);
 A criação do EntityManager deve ser feita via injeção de dependência (anotação);
 O pool deve apontar para um banco de dados real (PostgreSQL ou MySQL);
 Código deve ser commitado no GitHub até às 23h59m do dia 17/03/2017
 Começos as classes de teste herdando a classe BaseTest
 Adição do método utilitário salvarClientes
 Adição do método utilitário salvarProdutos
 Adição dos métodos utilitários criarVenda e criarProduto
 Adição do método utilitário salvarVendas
 Implementação pioneira de consulta por critérios
 Menos verboso que a Criteria API na especificação da JPA
 Depreciada a partir da versão 5.2 do Hibernate
 Utilizada em centenas de milhares de projetos com Hibernate
 A interface org.hibernate.Criteria representa a query ao invés de uma classe
persistente particular
 A sessão é uma fábrica para intancias de Criteria
 https://docs.jboss.org/hibernate/orm/5.0/userguide/html_single/Hibernate_User_
Guide.html#appendix-legacy-criteria
 A unidade testará a consulta da entidade com DISTINCT e o método list
 A unidade testará a consulta do maior registro com MAX e uniqueResult
 A unidade testará a consulta com WHERE usando BETWEEN e COUNT
 A unidade testará a consulta com filtro IN e ordenação com ORDER BY
 A unidade testará a consulta paginada com LIMIT e OFFSET
 A unidade testará a consulta fazendo INNER JOIN
 A unidade testará a consulta filtrando parte do nome com ILIKE
 A unidade testará a consulta com a condicional OR
 A unidade testará a consulta filtrando parte do nome e fazendo LEFT JOIN
 A unidade testará a consulta trazendo campos específicos com PROJECTION
 A unidade testará a consulta trazendo campos específicos em um MAP
 A unidade testará a consulta de campos no objeto com ResultTransformer
 A unidade testará a consulta uso de SUBQUERY no filtro com DetachedCriteria
 Qual a responsabilidade/objeto das anotações:
 @MappedSuperclass
 @Version
 @Entity
 @Table
 @Id
 @GeneratedValue
 @Column
 @Basic
 @Temporal
 Qual a responsabilidade/objeto das anotações:
 @ManyToOne
 @ManyToMany
 @OneToOne
 @JoinColumn
 @JoinTable
 Qual a responsabilidade/objeto dos métodos do EntityManager:
 isOpen
 close
 createQuery
 find
 merge
 persist
 remove
 Como instânciar Criteria do Hibernate através do EntityManager?
 Dê exemplo do código
 Como abrir uma transação?
 Dê exemplo do código
 Como fechar uma transação?
 Dê exemplo do código
 Como criar e executar uma query com JPQL?
 Dê exemplo do código
 Qual a responsabilidade dos valores FetchType.LAZY e FetchType.EAGER?
 Qual a responsabilidade dos valores CascadeType.PERSIST e CascadeType.REMOVE?
 Como fazer uma operação BATCH (DELETE ou UPDATE) através do EntityManager?
 Qual a explicação para a exception LazyInitializationException?
 Modelar no mínimo três entidades;
 Mapear os relacionamentos um-para-muitos, muitos-para-um e muitos-para-muitos;
 Mapear persistência em cascata (PERSIST) em um dos relacionamentos;
 Mapear carregamento LAZY para todos os relacionamentos de todas entidades
 Criar testes unitários das operações de CRUD para cada entidade;
 Criar testes unitários com pelo menos três consultas diferentes usando JPQL para
cada entidade
 Criar testes unitários com pelo menos três consultas diferentes usando Criteria do
Hibernate para cada entidade
 Código deve ser commitado no GitHub até às 23h59m do dia 24/03/2017
 Dica: Use o livro Pro JPA 2, 2nd Edition como referência

Persistência JPA

  • 1.
    Pós-Graduação em DesenvolvimentoFull Stack – Fac. Delta Prof. Átilla Barros - @atilla8huno
  • 2.
     Entity  Classesque possuem atributos e relacionamentos  Persistability  São persistidas e seu estado representa um registro no banco de dados (BD)  Identity  Possuem uma chave única que diferencia o objeto de outros e são representados no BD  Transactionality  Entidades são criadas, atualizadas e excluídas em um contexto transacional no BD  Granularity  Objeto simples que possui atributos armazenados em um único lugar
  • 3.
     Entity Metadata Toda entidade devem ter seu mapeamento feito (XML ou Annotation)  XML sobrescreve o mapeamento redundante feito via anotação  Toda entidade deve ter um construtor vazio  Para o correto comportamento é necessário implementar equals e hashCode
  • 4.
  • 5.
  • 6.
     Entity Manager API invocada antes da entidade ser persistida  Várias chamadas à API é necessária para executar várias ações no BD  Interface javax.persistence.EntityManager  Um provider é quem faz a implementação da JPA (Hibernate, EclipseLink, etc)  Managed Entity  O EntityManager possui um escopo de entidades gerenciadas (Persistence Context)  Só é possível executar ações em entidades gerenciadas  Apenas uma instância com o mesmo ID fica no escopo  Uma entidade é gerenciada quando é lida do banco ou passada por argumento em alguma chamada de método do EntityManager
  • 7.
     Entity ManagerFactory  Todo EntityManager é criado a partir de uma fábrica de objetos  EntityManager é a representação de uma unidade de persistência (PU)  Uma única instância da factory por PU  Persistence Unit  Configurações e classes  PUs são nomeadas para identificação na factory
  • 9.
     Persistence Unit Uma unidade de persistência é configurada no arquivo persistence.xml  O arquivo persistence.xml deve ficar no diretório META-INF
  • 10.
     Fork dorepositório  https://github.com/atilla8huno/jpa-seed  Clone da fork  Execute o comando abaixo em seu workspace  git clone https://github.com/suaContaGitHub/jpa-seed  Baixe as dependências  Execute o comando abaixo no diretório do projeto  mvn clean install  Importe o projeto na IDE Eclipse  File > Import > Existing Maven Projects > Next > Root Directory > Finish
  • 11.
     @Test  Usadoem métodos public void, non-static  Indica que o método é uma unidade de teste  @Test(expected = Exception.class)  Indica que a unidade de teste espera que seja lançada uma exceção  @Before  Indica que o método será executado antes de cada teste da classe  @After  Indica que o método será executado depois de cada teste da classe  @AfterClass  Indica que o método será executado após toda a execução da classe  Usado em métodos static
  • 12.
     import staticorg.junit.Assert.*;  Importa todas as funções de verificação sem a necessidade de instância  assertFalse(“comentário", expressão);  Usado para verificar se determinada expressão é falsa  assertTrue(“comentário", expressão);  Usado para verificar se determinada expressão é verdadeira  assertNull(“comentário", objeto);  Usado para verificar se determinado objeto é null  assertNotNull(“comentário", objeto);  Usado para verificar se determinado objeto é diferente de null  fail(“comentário");  Usado para falhar o teste caso a execução do método chegue até aquele ponto
  • 16.
     Testamos seo EntityManager é instânciado antes de cada execução
  • 17.
     Testamos seo escopo do EntityManager é fechado depois de cada execução
  • 18.
     Testamos seo EntityManager consegue abrir uma nova transação
  • 21.
     Anotação usadapara mapear classes que herdadas por entidades
  • 22.
     Anotação usadapara mapear atributo de versionamento (Optimistic Locking)
  • 24.
     Usado sempreque precisar saber se a entidade já foi persistida ou é nova
  • 26.
     Usado paradefinir detalhes da tabela do BD que a entidade representará
  • 27.
     @Id  Usadopara mapear a chave primária da entidade  Pode ser usada em tipos primitivos, wrappers e classes  Faz uso do equals e hashCode  @GeneratedValue  Usado para mapear um gerador de valores para a chave primária  strategy = GenerationType.AUTO, IDENTITY, SEQUENCE ou TABLE
  • 28.
     Usada paradetalhar a coluna que o atributo representa
  • 29.
     @Temporal  Usadapara mapear campos Date, Time e DateTime  @Basic  Usada para especificar se a coluna é NULL ou NOT NULL  Usada também para especificar o carregamento do atributo ao consultar (LAZY e EAGER)
  • 31.
     Usada paramapear um relacionamento de muitos-para-um ou um-para-um  Pode-se especificar os atributos:  fetch – diz se o relacionamento será ou não carregado após consulta da entidade  cascade – diz se o relacionamento sofrerá as mesmas ações de persistência que a entidade  option – diz se a respectiva coluna do relacionado é definida como NULL ou NOT NULL  targetEntity – especifica a classe da entidade em caso de mapear uma classe mais genérica  @OneToOne  mappedBy – usado para mapear um relacionamentos bi-direcionais; é usado no lado fraco do relacionamento; o atributo recebe uma String com o nome do objeto no lado forte  orphanRemoval – excluir ou não registros lixo após desfazer um relacionamento
  • 32.
     Usada paraespecificar detalhes sobre a coluna da Foreign Key
  • 33.
     Usada paramapear um relacionamento um-para-muitos  Ex: um Cliente possui várias Vendas  Usada, geralmente, para mapear o lado fraco de um relacionamento bi-direcional  Possui os mesmos atributos da anotação @OneToOne
  • 35.
     Usada paramapear um relacionamento muitos-pra-muitos  Ex: Uma Venda possui vários Produtos; um Produto pode ser vendido várias vezes;  Os atributos da anotação se assemelham à anotação @OneToOne
  • 36.
     Usada paradetalhar a tabela de junção dos relacionamentos @*ToMany  Possui os atributos da anotação @Table  Mais os atributos:  foreignKey – especifica o nome da constraint FK de um dos lados do relacionamento  inverseForeignKey –nome da constraint FK do outro lado do relacionamento  joinColumns – mapear detalhes da coluna da FK de um dos lados do relacionamento  inverseJoinColumns – mapear detalhes da coluna da FK do outro lado do relacionamento
  • 37.
     Uso dasduas anotações em conjunto para mapear muitos-pra-muitos
  • 40.
     A primeiraunidade testará o método persist do EntityManager
  • 41.
     A unidadetestará o método createQuery do EntityManager
  • 42.
     A unidadetestará o método merge do EntityManager
  • 43.
     A unidadetestará os métodos find e remove do EntityManager e a função MAX
  • 44.
     A unidadetestará a execução da BATCH UPDATE/DELETE do EntityManager
  • 47.
     A unidadetestará o método persist do EntityManager
  • 48.
     A unidadetestará a consulta de um campo específico com filtro na query
  • 49.
     A unidadetestará a consulta com Constructor Expression
  • 50.
     A unidadetestará a consulta de vários atributos distintos
  • 51.
     A unidadetestará a função COUNT da JPQL
  • 52.
     A unidadetestará o método getSingleResult quando há vários registros no retorno
  • 53.
     A unidadetestará o método getSingleResult quando não há registros no retorno
  • 54.
     A unidadetestará o carregamento LAZY do EntityManager
  • 55.
     A unidadetestará o carregamento LAZY e a função detach do EntityManager
  • 58.
  • 59.
     A unidadetestará a persistência de atributos mapeados com CascadeType.PERSIST
  • 60.
     A unidadetestará a o merge sem CascadeType.MERGE mapeado
  • 61.
     A unidadetestará a consulta fazendo JOIN nos relacionamentos (Parte I)
  • 62.
     A unidadetestará a consulta fazendo JOIN nos relacionamentos (Parte II)
  • 64.
     Grupo SpringBoot com Tomcat Embedded  Grupo Java EE com Wildfly  Grupo CDI com Tomcat
  • 65.
     Modelar nomínimo seis entidades e os relacionamentos;  Duas entidades devem possuir chave primária composta;  Duas entidades devem possuir mapeamento de Enum;  Uma entidade deve ter mapeado um atributo Embedded;  Uma entidade deve ter mapeado um atributo Map;  Deve ser criado uma entidade base genérica, usada como superclass das entidades;  Duas entidades devem sobrescrever o atributo version da entidade base;  Criar APIs de CRUD para cada entidade;  Controle transacional deve ser feito via anotação (automática);  A criação do EntityManager deve ser feita via injeção de dependência (anotação);  O pool deve apontar para um banco de dados real (PostgreSQL ou MySQL);  Código deve ser commitado no GitHub até às 23h59m do dia 17/03/2017
  • 67.
     Começos asclasses de teste herdando a classe BaseTest
  • 68.
     Adição dométodo utilitário salvarClientes
  • 69.
     Adição dométodo utilitário salvarProdutos
  • 70.
     Adição dosmétodos utilitários criarVenda e criarProduto
  • 71.
     Adição dométodo utilitário salvarVendas
  • 72.
     Implementação pioneirade consulta por critérios  Menos verboso que a Criteria API na especificação da JPA  Depreciada a partir da versão 5.2 do Hibernate  Utilizada em centenas de milhares de projetos com Hibernate  A interface org.hibernate.Criteria representa a query ao invés de uma classe persistente particular  A sessão é uma fábrica para intancias de Criteria  https://docs.jboss.org/hibernate/orm/5.0/userguide/html_single/Hibernate_User_ Guide.html#appendix-legacy-criteria
  • 74.
     A unidadetestará a consulta da entidade com DISTINCT e o método list
  • 75.
     A unidadetestará a consulta do maior registro com MAX e uniqueResult
  • 76.
     A unidadetestará a consulta com WHERE usando BETWEEN e COUNT
  • 77.
     A unidadetestará a consulta com filtro IN e ordenação com ORDER BY
  • 78.
     A unidadetestará a consulta paginada com LIMIT e OFFSET
  • 79.
     A unidadetestará a consulta fazendo INNER JOIN
  • 80.
     A unidadetestará a consulta filtrando parte do nome com ILIKE
  • 81.
     A unidadetestará a consulta com a condicional OR
  • 82.
     A unidadetestará a consulta filtrando parte do nome e fazendo LEFT JOIN
  • 83.
     A unidadetestará a consulta trazendo campos específicos com PROJECTION
  • 84.
     A unidadetestará a consulta trazendo campos específicos em um MAP
  • 85.
     A unidadetestará a consulta de campos no objeto com ResultTransformer
  • 86.
     A unidadetestará a consulta uso de SUBQUERY no filtro com DetachedCriteria
  • 88.
     Qual aresponsabilidade/objeto das anotações:  @MappedSuperclass  @Version  @Entity  @Table  @Id  @GeneratedValue  @Column  @Basic  @Temporal
  • 89.
     Qual aresponsabilidade/objeto das anotações:  @ManyToOne  @ManyToMany  @OneToOne  @JoinColumn  @JoinTable
  • 90.
     Qual aresponsabilidade/objeto dos métodos do EntityManager:  isOpen  close  createQuery  find  merge  persist  remove
  • 91.
     Como instânciarCriteria do Hibernate através do EntityManager?  Dê exemplo do código  Como abrir uma transação?  Dê exemplo do código  Como fechar uma transação?  Dê exemplo do código  Como criar e executar uma query com JPQL?  Dê exemplo do código  Qual a responsabilidade dos valores FetchType.LAZY e FetchType.EAGER?  Qual a responsabilidade dos valores CascadeType.PERSIST e CascadeType.REMOVE?  Como fazer uma operação BATCH (DELETE ou UPDATE) através do EntityManager?  Qual a explicação para a exception LazyInitializationException?
  • 92.
     Modelar nomínimo três entidades;  Mapear os relacionamentos um-para-muitos, muitos-para-um e muitos-para-muitos;  Mapear persistência em cascata (PERSIST) em um dos relacionamentos;  Mapear carregamento LAZY para todos os relacionamentos de todas entidades  Criar testes unitários das operações de CRUD para cada entidade;  Criar testes unitários com pelo menos três consultas diferentes usando JPQL para cada entidade  Criar testes unitários com pelo menos três consultas diferentes usando Criteria do Hibernate para cada entidade  Código deve ser commitado no GitHub até às 23h59m do dia 24/03/2017  Dica: Use o livro Pro JPA 2, 2nd Edition como referência