O documento descreve os principais conceitos da JPA, como mapeamento de entidades, relacionamentos, EntityManager e consultas. Ele também apresenta exemplos de anotações, métodos e testes unitários para validar o funcionamento da API.
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
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
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
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
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
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