Java Enterprise Edition - JEE
02. JPA e Padrões de Projeto
Esp. Márcio Palheta
gtalk: marcio.palheta@gmail.com
JPA e Padrões de Projeto
O objeto que define acesso ao BD é do tipo EntityManager - EM;
A interface EntityManagerFactory define o
A interface EntityManagerFactory define o
método para criação do EM, conforme e
código a seguir:
A EntityManagerFactory – EMF
O processo de criação de uma EMF envolve atividades como:
O JPA Provider lê todas as anotações
O JPA Provider lê todas as anotações realizadas em classes Entidade;
Criação de conexão para acesso ao BD
Atualizações incrementais do esquema de Banco de dados;
Isso nos leva à conclusão: EMF é um
“Só pode haver um” (Highlander, 1986)
Vamos criar uma nova EMF, sempre que precisamos de uma conexão?
NÃO. Nossa aplicação precisa de
NÃO. Nossa aplicação precisa de apenas uma EMF;
Para isso, criaremos uma classe
utilitária, onde será definida a EMF do
nosso sistema;
Exercício 01 - JPAUtil.java
JPAUtil e Padrões de Projeto
Singleton: Garante a existência de apenas uma instância da classe;
Implementado no método estático para Implementado no método estático para criação de EntityManagerFactory;
Factory: Define uma interface para criação de famílias de objetos
relacionados. Aplicado na criação de
conexões - EntityManager
Pensando em conexões
Precisamos cuidar do ciclo de vida dos nossos objetos EntityManager – EM
EM consume recursos caros, como:
conexão com banco de dados e cache;
conexão com banco de dados e cache;
Após o uso, feche as conexões;
Verifique o status das transações;
No dia-a-dia, usamos frameworks para
injetar EM – Curso de JSF2 e CDI;
Encapsulamento da JPA
JPA atua diretamente na camada de dados – persistência;
Vamos espalhar o código de acesso por
Vamos espalhar o código de acesso por toda a nossa aplicação?
NÃO.
Vamos encapsular as regras da camada
de modelo em classe utilitárias.
Data Access Object - DAO
Padrão de projeto que define classes utilitárias para acesso às tabelas do BD
Classes do tipo DAO emcapsulam o
Classes do tipo DAO emcapsulam o acesso à base de dados da aplicação;
Relacionamento:
Tabela: Produto;
Classe DAO: ProdutoDAO;
Início da classe ContaDAO
Exercício 02
Implemente a classe ContaDAO;
Implemente a classe ContaDAOTeste;
Na classe de testes, crie objetos Conta
Na classe de testes, crie objetos Conta e invoque a persistencia da classe
ContaDAO;
Itens a ponderar
O EntityManager aberto em salvar(), só pode ser fechado no próprio método.
Se não fecharmos, o EM fica aberto
Se não fecharmos, o EM fica aberto para sempre;
O DAO não deveria se preocupar com
abertura e fechamento de EM, nem
tratamento de transações;
Criando dependência
Melhorando a persistência
Itens a ponderar
Com o tempo, as aplicações tendem a crescer e novas entidades são incluídas;
Para cadastra um entidade, precisamos
Para cadastra um entidade, precisamos invocar entityManager.persist();
O código será repetido em vários DAOs?
Poderíamos criar um DAO genérico que
sirva para qualquer entidade;
Exercício 03 – GenericDAO
Atualização do modelo
A classe ContaDAO não precisa mais implementar os métodos comuns;
Qualquer classe DAO pode usar os
Qualquer classe DAO pode usar os métodos criados no DAO Genérico;
Para isso, precisamos de um atributo do
tipo GenericDAO;
Exercício 04 – ContaDAO
Herança no DAO genérico
Poderíamos usar a herança para
acessar o métodos do DAO genérico;
Nessa abordagem, métodos não
Nessa abordagem, métodos não necessários a uma classe, seriam herdados;
E se não fosse possível excluir uma
conta criada?
Exercício 05 – Adicionar conta
Exercício 06 – Pesquisar conta
Exercício 07 – Listar contas
Exercício 08 – excluir conta
Exercício 09 – Alterar conta
O que vem a seguir
Novos relacionamentos;
Trabalhando com ENUMs;
Verificando a cardinalidade;
Verificando a cardinalidade;
TransientObjectException;
Atualização do modelo: Movimentação
Referências
www.caelum.com.br
http://hibernate.org/docs
Hall, Marty, “Core Servlets and Java Server
Hall, Marty, “Core Servlets and Java Server Pages”, Janeiro 2002, Sun Microsystems
Press;
http://java.sun.com/j2ee/1.6/docs/tutorial/d oc/index.html