SlideShare une entreprise Scribd logo
1  sur  32
Java Persistence API
JPA
Marco Reis
Software Architect
http://marcoreis.net
Agenda
• Mapeamento objeto-relacional.
• JPA x Hibernate.
• Criação das tabelas.
• Executar comandos de inclusão, alteração, exclusão e
consulta.
Código-fonte
• O projeto de exemplo com o código-fonte está disponível
em:
–
https://github.com/masreis/e-commerce
Mapeamento objeto-relacional
• JPA é um modelo de persistência baseado
em POJO.
• Java é utilizada em ambientes corporativos,
com grandes bancos de dados.
• Agiliza o desenvolvimento, já que não
precisamos escrever comandos SQL.
• Fácil de mudar de banco de dados, caso
necessário.
JPA x Hibernate
• JPA é a especificação da Oracle para
mapenamento objeto-relacional.
• Hibernate apresentava uma maneira mais
elegante de trabalhar com a persistência do
que o J2EE.
Arquivo de configuração
• O arquivo persistence.xml contém os parâmetros de
configuração para acesso ao banco de dados e deve
estar no diretório META-INF.
• Persistence unit name (e-commerce-pu): indica os
parâmetros de acesso à base de dados.
• transaction-type: RESOURCE_LOCAL para servidor web
e JTA para servidor de aplicação.
• Provider: qualquer implementação do JPA. Pode ser o
Hibernate, OpenJPA ou EclipseLink, que é o produto
oficial da Oracle.
persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="e-commerce-pu" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" />
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver" />
<property name="javax.persistence.jdbc.url"
value="jdbc:hsqldb:file:e-commerce/db;shutdown=true;hsqldb.write_delay=false;" />
<property name="javax.persistence.jdbc.user" value="SA" />
<property name="javax.persistence.jdbc.password" value="" />
</properties>
</persistence-unit>
</persistence>
Entidades
• Com JPA podemos mapear as classes de entidade
diretamente para o banco de dados.
• Vamos considerar as seguintes classes:
–
Usuario
–
Cliente
–
Produto
–
Categoria
• As anotações do JPA estão no pacote
javax.persistence.
Classe Usuario
package net.marcoreis.ecommerce.entidades;
import java.util.Date;
public class Usuario {
private Long id;
private String email;
private String nome;
private Date ultimoLogin;
{sets e gets}
}
Classe Usuario persistente
@Entity
public class Usuario {
@Id
@GeneratedValue
private Long id;
private String email;
private String nome;
private Date ultimoLogin;
}

• Para persistir uma classe usando JPA é necessário
adicionar ao menos as seguintes anotações:
–

@Entity: a classe será armazenada em uma tabela.

–

@Id: campo da chave-primária.

–

@GeneratedValue: a chave-primária será gerada
automaticamente.
Teste unitário com JUnit
•

As funcionalidades serão testadas com o Junit.

•

Cada funcionalidade será validada com um teste unitário.

•

As classes de teste vão ficar no pacote:
–

net.marcoreis.ecommerce.teste

•

As classes do JUnit estão em org.junit.

•

Para rodar um teste, vá no menu Run-Run as-JUnit test.

•

Adicione a dependência do Maven no pom.xml.

•

Utilize o @Before e @After para inicializar e finalizar variáveis. Quando o teste envolver
inclusão, alteração ou exclusão de registros, é obrigatório o begin() e commit().
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
Inserindo registros
public class TesteInsereUsuario {
private EntityManager em;
@Before
public void inicializar() {
em = JPAUtil.getInstance().getEntityManager();
em.getTransaction().begin();
}
@After
public void finalizar() {
em.getTransaction().commit();
em.close();
}
@Test
public void inserirUsuario() {
Usuario usuario = new Usuario();
usuario.setEmail("ma@marcoreis.net");
usuario.setNome("Marco Reis");
Date data = new Date();
usuario.setUltimoLogin(data);
em.persist(usuario);
}
}
Consulta registros gravados
•

Para consultar os registros já gravados vamos usar uma Query ou
uma NamedQuery.

•

A NamedQuery fica na classe persistente, enquanto que a Query
pode estar em qualquer outra classe do sistema.

•

Os parâmetros podem usar as seguintes formas:
–

:nomeParametro1, :nomeParametro2.

–

?1, ?2, ?3.

@Entity
@NamedQuery(name = "usuario.consultaAcessoDia", query = "from Usuario where cast(ultimoLogin as
date) = :data")
public class Usuario {
@Id
@GeneratedValue
private Long id;
private String email;
private String nome;
private Date ultimoLogin;
}
NamedQuery
• Adicione uma NamedQuery em Usuario.
• O cast é necessário porque a data é armazenada em
timestamp, e a consulta deve considerar somente a data,
ignorando a hora/minuto/segundo.
@Entity
@NamedQuery(name = "usuario.consultaAcessoDia", query = "from Usuario where cast(ultimoLogin as
date) = :data")
public class Usuario {
@Id
@GeneratedValue
private Long id;
private String email;
private String nome;
private Date ultimoLogin;
}
Consulta registros gravados
• Em seguida, vamos criar o teste unitário para verificar os
usuários cadastrados.
public class TesteConsultaUsuarios {
private EntityManager em;
@Before
public void inicializar() {
em = JPAUtil.getInstance().getEntityManager();
}
@After
public void finalizar() {
em.close();
}
}
Consulta registros gravados
• O primeiro teste unitário utiliza uma Query, retornando
todos os usuários cadastrados.
@Test
public void consultaTodosUsuarios() {
String queryJPA = "from Usuario";
Query query = em.createQuery(queryJPA);
List<Usuario> usuarios = query.getResultList();
for (Usuario usuario : usuarios) {
System.out.println("Nome: " + usuario.getNome());
}
}
Consulta registros gravados
• O teste unitário abaixo acessa a NamedQuery e passa
um parâmetro, mostrando apenas os registros que têm a
data de hoje.
@Test
public void consultaUsuriosAcessoDia() {
em = JPAUtil.getInstance().getEntityManager();
Query query = em.createNamedQuery("usuario.consultaAcessoDia");
query.setParameter("data", new Date());
List<Usuario> usuarios = query.getResultList();
for (Usuario usuario : usuarios) {
System.out.println("Nome/ultimo login: " + usuario.getNome()
+ " - " + usuario.getUltimoLogin());
}
}
Alterando registros gravados
• Para os testes abaixo crie a classe TesteAlteraUsuario.
• Para alterar um registro, primeiro faça uma consulta pelo
ID. Dessa forma, o objeto será gerenciado pelo
EntityManager e poderá ser atualizado.
@Test
public void alterarUsuario() {
Long id = 2l;
Usuario usuario = em.find(Usuario.class, id);
Assert.assertNotNull("Usuario não cadastrado", usuario);
usuario.setEmail("diego@lucas.net");
usuario.setNome("Diego Lucas");
Date data = new Date();
usuario.setUltimoLogin(data);
em.persist(usuario);
}
Removendo registros gravados
• Para os testes abaixo crie a classe
TesteRemoveUsuario.
• A exclusão deve ser feita após uma consulta pelo ID,
seguindo a mesma ideia da alteração.
@Test
public void removerUsuario() {
Long id = 5l;
Usuario usuario = em.find(Usuario.class, id);
Assert.assertNotNull("Usuario não cadastrado", usuario);
em.remove(usuario);
}
Herança
• Há 3 estratégias de herança no JPA:
– JOINED: uma tabela para cada entidade, não repete
os campos.
– SINGLE_TABLE: apenas uma tabela para todas as
classes.
– TABLE_PER_CLASS: uma tabela para cada classe,
repetindo todos os campos.
Classe Cliente
• Para mostrar o funcionamento da herança no JPA, crie a
classe Cliente, subclasse de Usuario.
• Não é necessário redefinir o Id, que já está na
superclasse.
@Entity
public class Cliente extends Usuario {
@Column(unique = true, nullable = false)
private String cpfCnpj;
{sets e gets}
}
Teste do Cliente
• Agora, crie a classe TesteInsereCliente para testar a
nova entidade.
• Não se esqueça dos métodos de inicialização e
finalização.
• A título de teste, comente a linha do cpfCnpj e veja o
resultado.
@Test
public void inserirCliente() {
Cliente cliente = new Cliente();
cliente.setEmail("jose@oracle.com");
cliente.setNome("Jose Carlos");
// cliente.setCpfCnpj("123456");
em.persist(cliente);
Assert.assertTrue("Cliente gravado com sucesso", cliente.getId() > 0);
}
Como funciona
• Acompanhando o log do Hibernate podemos verificar
que foram incluídos 2 registros, um na tabela Usuario e
outro na tabela Cliente.
• Isso porque a estratégia de herança selecionada foi
JOINED.
Hibernate:
insert
into
Usuario
(id, email, nome, ultimoLogin)
values
(default, ?, ?, ?)
Hibernate:
insert
into
Cliente
(cpfCnpj, id)
values
(?, ?)
Atividade
• Crie as classes de teste Categoria:
– Inclusão.
– Alteração.
– Exclusão.
– Consulta todas as categorias.
Relacionamentos
• O JPA tem as seguintes multiplicidades, seguindo o
modelo relacional:
– many-to-one.
– one-to-one.
– one-to-many.
– many-to-many.
Many-to-one
• O relacionamento many-to-one está presente na classe
produto.
• Segundo o modelo, cada produto deve ter uma
categoria.
public class Produto {
@Id
@GeneratedValue
private Long id;
@ManyToOne
private Categoria categoria;
private String nome;
private String descricao;
private String especificacaoLoja;
@Lob
private byte[] especificacaoFabricante;
private Double preco;
}
Inserindo produtos
• Para inserir um produto precisamos escolher uma
categoria válida.
• O primeiro passo é pesquisar uma categoria já
cadastrada.
• Em seguida podemos preencher os demais atributos e
persistir a entidade.
@Test
public void inserirProduto() {
Long idCategoria = 12l;
Categoria categoria = em.find(Categoria.class, idCategoria);
Assert.assertNotNull("Categoria não cadastrada", categoria);
Produto produto = new Produto();
produto.setCategoria(categoria);
produto.setDescricao("Colcha para cama de solteiro 120cm x 210cm");
produto.setNome("Colcha para cama de solteiro");
produto.setPreco(150.00);
em.persist(produto);
}
Consultando produtos
• Para os exemplos seguintes crie a classe
TesteConsultaProdutos.
• O primeiro teste, consultarTodasCategorias, segue o
mesmo princípio das demais.
@Test
public void consultarTodosProdutos() {
System.out.println("Consultar todos os produtos");
List<Produto> produtos = em.createQuery("from Produto").getResultList();
for (Produto p : produtos) {
System.out.println(p.getId() + " - " + p.getNome());
}
}
Consultando produtos pela categoria
• O exemplo abaixo mostra os produtos de uma categoria
específica.
• Este teste usa uma Query, mas poderia ser facilmente
adaptado para utilizar NamedQuery.
@Test
public void consultarProdutosPelaCategoria() {
System.out.println("Consultar produtos pela categoria");
Long idCategoria = 12l;
List<Produto> produtos = em
.createQuery("from Produto where categoria.id = ?1")
.setParameter(1, idCategoria ).getResultList();
for (Produto p : produtos) {
System.out.println(p.getId() + " - " + p.getNome());
}
}
Consultando quantidades
• Adicione as NamedQueries abaixo em Produto e o teste
na classe TesteConsultaProdutos.
@NamedQueries({
@NamedQuery(name = "produto.consultaTotalPorCategoria", query = "select count(p) from
Produto p where categoria.id = :idCategoria"),
@NamedQuery(name = "produto.consultaPorIntervaloPreco", query = "from Produto where preco
>= ?1 and preco <= ?2") })

@Test
public void consultarTotalProdutoPelaCategoria() {
System.out.println("Consultar total de produtos pela categoria");
Query query = em.createNamedQuery("produto.consultaTotalPorCategoria");
Long idCategoria = 12l;
query.setParameter("idCategoria", idCategoria);
Object resultado = query.getSingleResult();
System.out.println("Total de produtos na categoria: " + resultado);
}
Atividades
• Criar o teste unitário para a NamedQuery
'produto.consultaPorIntervaloPreco' na classe
TesteConsultaProdutos.
• Criar as classes abaixo, com seus relacionamentos,
atributos e testes unitários.
– Venda (id, data, cliente).
– Item (id, produto, quantidade, valorUnitario, venda).
Referência
• http://docs.oracle.com/javaee/6/tutorial/

Contenu connexe

Tendances (20)

Como construir aplicações gráficas e applets
Como construir aplicações gráficas e appletsComo construir aplicações gráficas e applets
Como construir aplicações gráficas e applets
 
Testes de Integração
Testes de IntegraçãoTestes de Integração
Testes de Integração
 
Tutorial +login+mvc
Tutorial +login+mvcTutorial +login+mvc
Tutorial +login+mvc
 
Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)Curso de Java Persistence API (JPA) (Java EE 7)
Curso de Java Persistence API (JPA) (Java EE 7)
 
Fundamentos de Objetos Remotos
Fundamentos de Objetos RemotosFundamentos de Objetos Remotos
Fundamentos de Objetos Remotos
 
PDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NETPDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NET
 
Apache Ant
Apache AntApache Ant
Apache Ant
 
UOL Tech Day: Testes de Integração com OpenEJB
UOL Tech Day: Testes de Integração com OpenEJBUOL Tech Day: Testes de Integração com OpenEJB
UOL Tech Day: Testes de Integração com OpenEJB
 
03 fundamentos java
03 fundamentos java03 fundamentos java
03 fundamentos java
 
J530 15 workshop
J530 15 workshopJ530 15 workshop
J530 15 workshop
 
Persistência JPA
Persistência JPAPersistência JPA
Persistência JPA
 
Java swing
Java swingJava swing
Java swing
 
J530 14 xdoclet
J530 14 xdocletJ530 14 xdoclet
J530 14 xdoclet
 
Fundamentos de JDBC
Fundamentos de JDBCFundamentos de JDBC
Fundamentos de JDBC
 
Jason: Componentes personalizados
Jason: Componentes personalizados Jason: Componentes personalizados
Jason: Componentes personalizados
 
Introdução ao JavaFX
Introdução ao JavaFXIntrodução ao JavaFX
Introdução ao JavaFX
 
JUnit
JUnitJUnit
JUnit
 
Java Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsJava Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e Servlets
 
Testes de Sistema
Testes de SistemaTestes de Sistema
Testes de Sistema
 
Java 12
Java 12Java 12
Java 12
 

En vedette

Aplicacoes gráficas em Java
Aplicacoes gráficas em JavaAplicacoes gráficas em Java
Aplicacoes gráficas em JavaMarco Reis
 
2 1-jpa-mapeamento-simples
2 1-jpa-mapeamento-simples2 1-jpa-mapeamento-simples
2 1-jpa-mapeamento-simplesLukinha92
 
INTERFACES para o USUÁRIO - a base de um sistema de gerenciamento para restau...
INTERFACES para o USUÁRIO - a base de um sistema de gerenciamento para restau...INTERFACES para o USUÁRIO - a base de um sistema de gerenciamento para restau...
INTERFACES para o USUÁRIO - a base de um sistema de gerenciamento para restau...Michel Souza
 
Boas práticas com jpa 2 e hibernate flisol 2012
Boas práticas com jpa 2 e hibernate   flisol 2012Boas práticas com jpa 2 e hibernate   flisol 2012
Boas práticas com jpa 2 e hibernate flisol 2012Frederico Maia Arantes
 
Workshop modelando usuários, tarefas e idéias
Workshop modelando usuários, tarefas e idéiasWorkshop modelando usuários, tarefas e idéias
Workshop modelando usuários, tarefas e idéiasKarine Drumond
 
Processos iniciais do mapeamento OR
Processos iniciais do mapeamento ORProcessos iniciais do mapeamento OR
Processos iniciais do mapeamento ORNécio de Lima Veras
 
Empreendedorismo de Negócios com Informática - Aula 1 - O Empreendedor
Empreendedorismo de Negócios com Informática - Aula 1 - O EmpreendedorEmpreendedorismo de Negócios com Informática - Aula 1 - O Empreendedor
Empreendedorismo de Negócios com Informática - Aula 1 - O EmpreendedorMinistério Público da Paraíba
 
Empreendedorismo com foco na informática
Empreendedorismo com foco na informáticaEmpreendedorismo com foco na informática
Empreendedorismo com foco na informáticaInternet Sistemas
 
Sistema de gestão de restaurantes self service - ultima versão 3
Sistema de gestão de restaurantes self   service - ultima versão 3Sistema de gestão de restaurantes self   service - ultima versão 3
Sistema de gestão de restaurantes self service - ultima versão 3brunogea
 
Introdução ao JPA com Hibernate
Introdução ao JPA com HibernateIntrodução ao JPA com Hibernate
Introdução ao JPA com HibernateDanilo Braga
 
Persistência com JPA usando o NetBeans 7
Persistência com JPA usando o NetBeans 7Persistência com JPA usando o NetBeans 7
Persistência com JPA usando o NetBeans 7Claudio Martins
 
Restaurante
RestauranteRestaurante
Restaurantemarcuzu
 
Persistência Java: Hibernate e JPA
Persistência Java: Hibernate e JPAPersistência Java: Hibernate e JPA
Persistência Java: Hibernate e JPACaelum
 
Apostila Java Web com JSF, JPA e Primefaces
Apostila Java Web com JSF, JPA e PrimefacesApostila Java Web com JSF, JPA e Primefaces
Apostila Java Web com JSF, JPA e PrimefacesRosicleia Frasson
 

En vedette (20)

Aplicacoes gráficas em Java
Aplicacoes gráficas em JavaAplicacoes gráficas em Java
Aplicacoes gráficas em Java
 
Aula hibernate
Aula hibernateAula hibernate
Aula hibernate
 
2 1-jpa-mapeamento-simples
2 1-jpa-mapeamento-simples2 1-jpa-mapeamento-simples
2 1-jpa-mapeamento-simples
 
Minicurso jpa e hibernate
Minicurso jpa e hibernateMinicurso jpa e hibernate
Minicurso jpa e hibernate
 
Hibernate
HibernateHibernate
Hibernate
 
Apresentação mapeamento objeto relacional
Apresentação mapeamento objeto relacionalApresentação mapeamento objeto relacional
Apresentação mapeamento objeto relacional
 
Hibernate
HibernateHibernate
Hibernate
 
Jpa, hibernate and jpql
Jpa, hibernate and jpqlJpa, hibernate and jpql
Jpa, hibernate and jpql
 
INTERFACES para o USUÁRIO - a base de um sistema de gerenciamento para restau...
INTERFACES para o USUÁRIO - a base de um sistema de gerenciamento para restau...INTERFACES para o USUÁRIO - a base de um sistema de gerenciamento para restau...
INTERFACES para o USUÁRIO - a base de um sistema de gerenciamento para restau...
 
Boas práticas com jpa 2 e hibernate flisol 2012
Boas práticas com jpa 2 e hibernate   flisol 2012Boas práticas com jpa 2 e hibernate   flisol 2012
Boas práticas com jpa 2 e hibernate flisol 2012
 
Workshop modelando usuários, tarefas e idéias
Workshop modelando usuários, tarefas e idéiasWorkshop modelando usuários, tarefas e idéias
Workshop modelando usuários, tarefas e idéias
 
Processos iniciais do mapeamento OR
Processos iniciais do mapeamento ORProcessos iniciais do mapeamento OR
Processos iniciais do mapeamento OR
 
Empreendedorismo de Negócios com Informática - Aula 1 - O Empreendedor
Empreendedorismo de Negócios com Informática - Aula 1 - O EmpreendedorEmpreendedorismo de Negócios com Informática - Aula 1 - O Empreendedor
Empreendedorismo de Negócios com Informática - Aula 1 - O Empreendedor
 
Empreendedorismo com foco na informática
Empreendedorismo com foco na informáticaEmpreendedorismo com foco na informática
Empreendedorismo com foco na informática
 
Sistema de gestão de restaurantes self service - ultima versão 3
Sistema de gestão de restaurantes self   service - ultima versão 3Sistema de gestão de restaurantes self   service - ultima versão 3
Sistema de gestão de restaurantes self service - ultima versão 3
 
Introdução ao JPA com Hibernate
Introdução ao JPA com HibernateIntrodução ao JPA com Hibernate
Introdução ao JPA com Hibernate
 
Persistência com JPA usando o NetBeans 7
Persistência com JPA usando o NetBeans 7Persistência com JPA usando o NetBeans 7
Persistência com JPA usando o NetBeans 7
 
Restaurante
RestauranteRestaurante
Restaurante
 
Persistência Java: Hibernate e JPA
Persistência Java: Hibernate e JPAPersistência Java: Hibernate e JPA
Persistência Java: Hibernate e JPA
 
Apostila Java Web com JSF, JPA e Primefaces
Apostila Java Web com JSF, JPA e PrimefacesApostila Java Web com JSF, JPA e Primefaces
Apostila Java Web com JSF, JPA e Primefaces
 

Similaire à Aula JPA

CDI Extensions e DeltaSpike
CDI Extensions e DeltaSpikeCDI Extensions e DeltaSpike
CDI Extensions e DeltaSpikeRafael Benevides
 
Testes de regressão automatizados
Testes de regressão automatizadosTestes de regressão automatizados
Testes de regressão automatizadosCristian R. Silva
 
Android: testes automatizados e TDD
Android: testes automatizados e TDDAndroid: testes automatizados e TDD
Android: testes automatizados e TDDDextra
 
Framework de testes cecom
Framework de testes cecomFramework de testes cecom
Framework de testes cecomlucasbarsand
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Rafael Benevides
 
PDC - Testes - Usando o Testlink
PDC - Testes - Usando o TestlinkPDC - Testes - Usando o Testlink
PDC - Testes - Usando o Testlinkslides_teltools
 
TDC 2015 São Paulo - Clean Code para Testers
TDC 2015 São Paulo - Clean Code para TestersTDC 2015 São Paulo - Clean Code para Testers
TDC 2015 São Paulo - Clean Code para TestersStefan Teixeira
 
Aexo TI - Boas práticas de testes tdd
Aexo TI - Boas práticas de testes tddAexo TI - Boas práticas de testes tdd
Aexo TI - Boas práticas de testes tddCarlos Santana
 
Curso Java Básico - Aula 03
Curso Java Básico - Aula 03Curso Java Básico - Aula 03
Curso Java Básico - Aula 03Natanael Fonseca
 
Java - Introdução a banco de dados
Java - Introdução a banco de dadosJava - Introdução a banco de dados
Java - Introdução a banco de dadosSérgio Souza Costa
 
(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - Subalgoritmos(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - SubalgoritmosCarlos Santos
 
Testes Funcionais com Selenium
Testes Funcionais com Selenium Testes Funcionais com Selenium
Testes Funcionais com Selenium Mayron Cachina
 
Linguagem de Programação Java para Iniciantes
Linguagem de Programação Java para IniciantesLinguagem de Programação Java para Iniciantes
Linguagem de Programação Java para IniciantesOziel Moreira Neto
 
Testes de Unidade com Junit
Testes de Unidade com JunitTestes de Unidade com Junit
Testes de Unidade com Junitcejug
 
Desenvolvimento de Apps e Games para Android - Parte 5
Desenvolvimento de Apps e Games para Android - Parte 5Desenvolvimento de Apps e Games para Android - Parte 5
Desenvolvimento de Apps e Games para Android - Parte 5Erisvaldo Junior
 
Diapositivos práticos - Integração de Sistemas.pdf
Diapositivos práticos - Integração de Sistemas.pdfDiapositivos práticos - Integração de Sistemas.pdf
Diapositivos práticos - Integração de Sistemas.pdfJ0071
 

Similaire à Aula JPA (20)

CDI Extensions e DeltaSpike
CDI Extensions e DeltaSpikeCDI Extensions e DeltaSpike
CDI Extensions e DeltaSpike
 
Testes de regressão automatizados
Testes de regressão automatizadosTestes de regressão automatizados
Testes de regressão automatizados
 
Android: testes automatizados e TDD
Android: testes automatizados e TDDAndroid: testes automatizados e TDD
Android: testes automatizados e TDD
 
Framework de testes cecom
Framework de testes cecomFramework de testes cecom
Framework de testes cecom
 
Hibernate conceitos
Hibernate conceitosHibernate conceitos
Hibernate conceitos
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007
 
Mapeamento de herança OR
Mapeamento de herança ORMapeamento de herança OR
Mapeamento de herança OR
 
PDC - Testes - Usando o Testlink
PDC - Testes - Usando o TestlinkPDC - Testes - Usando o Testlink
PDC - Testes - Usando o Testlink
 
TDC 2015 São Paulo - Clean Code para Testers
TDC 2015 São Paulo - Clean Code para TestersTDC 2015 São Paulo - Clean Code para Testers
TDC 2015 São Paulo - Clean Code para Testers
 
Aexo TI - Boas práticas de testes tdd
Aexo TI - Boas práticas de testes tddAexo TI - Boas práticas de testes tdd
Aexo TI - Boas práticas de testes tdd
 
Aula5
Aula5Aula5
Aula5
 
Curso Java Básico - Aula 03
Curso Java Básico - Aula 03Curso Java Básico - Aula 03
Curso Java Básico - Aula 03
 
Java - Introdução a banco de dados
Java - Introdução a banco de dadosJava - Introdução a banco de dados
Java - Introdução a banco de dados
 
(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - Subalgoritmos(A10) LabMM3 - JavaScript - Subalgoritmos
(A10) LabMM3 - JavaScript - Subalgoritmos
 
Testes Funcionais com Selenium
Testes Funcionais com Selenium Testes Funcionais com Selenium
Testes Funcionais com Selenium
 
Linguagem de Programação Java para Iniciantes
Linguagem de Programação Java para IniciantesLinguagem de Programação Java para Iniciantes
Linguagem de Programação Java para Iniciantes
 
Testes de Unidade com Junit
Testes de Unidade com JunitTestes de Unidade com Junit
Testes de Unidade com Junit
 
Desenvolvimento de Apps e Games para Android - Parte 5
Desenvolvimento de Apps e Games para Android - Parte 5Desenvolvimento de Apps e Games para Android - Parte 5
Desenvolvimento de Apps e Games para Android - Parte 5
 
Implementação de
Implementação de Implementação de
Implementação de
 
Diapositivos práticos - Integração de Sistemas.pdf
Diapositivos práticos - Integração de Sistemas.pdfDiapositivos práticos - Integração de Sistemas.pdf
Diapositivos práticos - Integração de Sistemas.pdf
 

Aula JPA

  • 1. Java Persistence API JPA Marco Reis Software Architect http://marcoreis.net
  • 2. Agenda • Mapeamento objeto-relacional. • JPA x Hibernate. • Criação das tabelas. • Executar comandos de inclusão, alteração, exclusão e consulta.
  • 3. Código-fonte • O projeto de exemplo com o código-fonte está disponível em: – https://github.com/masreis/e-commerce
  • 4. Mapeamento objeto-relacional • JPA é um modelo de persistência baseado em POJO. • Java é utilizada em ambientes corporativos, com grandes bancos de dados. • Agiliza o desenvolvimento, já que não precisamos escrever comandos SQL. • Fácil de mudar de banco de dados, caso necessário.
  • 5. JPA x Hibernate • JPA é a especificação da Oracle para mapenamento objeto-relacional. • Hibernate apresentava uma maneira mais elegante de trabalhar com a persistência do que o J2EE.
  • 6. Arquivo de configuração • O arquivo persistence.xml contém os parâmetros de configuração para acesso ao banco de dados e deve estar no diretório META-INF. • Persistence unit name (e-commerce-pu): indica os parâmetros de acesso à base de dados. • transaction-type: RESOURCE_LOCAL para servidor web e JTA para servidor de aplicação. • Provider: qualquer implementação do JPA. Pode ser o Hibernate, OpenJPA ou EclipseLink, que é o produto oficial da Oracle.
  • 7. persistence.xml <?xml version="1.0" encoding="UTF-8"?> <persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"> <persistence-unit name="e-commerce-pu" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" /> <property name="hibernate.hbm2ddl.auto" value="update" /> <property name="hibernate.show_sql" value="true" /> <property name="hibernate.format_sql" value="true" /> <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver" /> <property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:file:e-commerce/db;shutdown=true;hsqldb.write_delay=false;" /> <property name="javax.persistence.jdbc.user" value="SA" /> <property name="javax.persistence.jdbc.password" value="" /> </properties> </persistence-unit> </persistence>
  • 8. Entidades • Com JPA podemos mapear as classes de entidade diretamente para o banco de dados. • Vamos considerar as seguintes classes: – Usuario – Cliente – Produto – Categoria • As anotações do JPA estão no pacote javax.persistence.
  • 9. Classe Usuario package net.marcoreis.ecommerce.entidades; import java.util.Date; public class Usuario { private Long id; private String email; private String nome; private Date ultimoLogin; {sets e gets} }
  • 10. Classe Usuario persistente @Entity public class Usuario { @Id @GeneratedValue private Long id; private String email; private String nome; private Date ultimoLogin; } • Para persistir uma classe usando JPA é necessário adicionar ao menos as seguintes anotações: – @Entity: a classe será armazenada em uma tabela. – @Id: campo da chave-primária. – @GeneratedValue: a chave-primária será gerada automaticamente.
  • 11. Teste unitário com JUnit • As funcionalidades serão testadas com o Junit. • Cada funcionalidade será validada com um teste unitário. • As classes de teste vão ficar no pacote: – net.marcoreis.ecommerce.teste • As classes do JUnit estão em org.junit. • Para rodar um teste, vá no menu Run-Run as-JUnit test. • Adicione a dependência do Maven no pom.xml. • Utilize o @Before e @After para inicializar e finalizar variáveis. Quando o teste envolver inclusão, alteração ou exclusão de registros, é obrigatório o begin() e commit(). <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> </dependency>
  • 12. Inserindo registros public class TesteInsereUsuario { private EntityManager em; @Before public void inicializar() { em = JPAUtil.getInstance().getEntityManager(); em.getTransaction().begin(); } @After public void finalizar() { em.getTransaction().commit(); em.close(); } @Test public void inserirUsuario() { Usuario usuario = new Usuario(); usuario.setEmail("ma@marcoreis.net"); usuario.setNome("Marco Reis"); Date data = new Date(); usuario.setUltimoLogin(data); em.persist(usuario); } }
  • 13. Consulta registros gravados • Para consultar os registros já gravados vamos usar uma Query ou uma NamedQuery. • A NamedQuery fica na classe persistente, enquanto que a Query pode estar em qualquer outra classe do sistema. • Os parâmetros podem usar as seguintes formas: – :nomeParametro1, :nomeParametro2. – ?1, ?2, ?3. @Entity @NamedQuery(name = "usuario.consultaAcessoDia", query = "from Usuario where cast(ultimoLogin as date) = :data") public class Usuario { @Id @GeneratedValue private Long id; private String email; private String nome; private Date ultimoLogin; }
  • 14. NamedQuery • Adicione uma NamedQuery em Usuario. • O cast é necessário porque a data é armazenada em timestamp, e a consulta deve considerar somente a data, ignorando a hora/minuto/segundo. @Entity @NamedQuery(name = "usuario.consultaAcessoDia", query = "from Usuario where cast(ultimoLogin as date) = :data") public class Usuario { @Id @GeneratedValue private Long id; private String email; private String nome; private Date ultimoLogin; }
  • 15. Consulta registros gravados • Em seguida, vamos criar o teste unitário para verificar os usuários cadastrados. public class TesteConsultaUsuarios { private EntityManager em; @Before public void inicializar() { em = JPAUtil.getInstance().getEntityManager(); } @After public void finalizar() { em.close(); } }
  • 16. Consulta registros gravados • O primeiro teste unitário utiliza uma Query, retornando todos os usuários cadastrados. @Test public void consultaTodosUsuarios() { String queryJPA = "from Usuario"; Query query = em.createQuery(queryJPA); List<Usuario> usuarios = query.getResultList(); for (Usuario usuario : usuarios) { System.out.println("Nome: " + usuario.getNome()); } }
  • 17. Consulta registros gravados • O teste unitário abaixo acessa a NamedQuery e passa um parâmetro, mostrando apenas os registros que têm a data de hoje. @Test public void consultaUsuriosAcessoDia() { em = JPAUtil.getInstance().getEntityManager(); Query query = em.createNamedQuery("usuario.consultaAcessoDia"); query.setParameter("data", new Date()); List<Usuario> usuarios = query.getResultList(); for (Usuario usuario : usuarios) { System.out.println("Nome/ultimo login: " + usuario.getNome() + " - " + usuario.getUltimoLogin()); } }
  • 18. Alterando registros gravados • Para os testes abaixo crie a classe TesteAlteraUsuario. • Para alterar um registro, primeiro faça uma consulta pelo ID. Dessa forma, o objeto será gerenciado pelo EntityManager e poderá ser atualizado. @Test public void alterarUsuario() { Long id = 2l; Usuario usuario = em.find(Usuario.class, id); Assert.assertNotNull("Usuario não cadastrado", usuario); usuario.setEmail("diego@lucas.net"); usuario.setNome("Diego Lucas"); Date data = new Date(); usuario.setUltimoLogin(data); em.persist(usuario); }
  • 19. Removendo registros gravados • Para os testes abaixo crie a classe TesteRemoveUsuario. • A exclusão deve ser feita após uma consulta pelo ID, seguindo a mesma ideia da alteração. @Test public void removerUsuario() { Long id = 5l; Usuario usuario = em.find(Usuario.class, id); Assert.assertNotNull("Usuario não cadastrado", usuario); em.remove(usuario); }
  • 20. Herança • Há 3 estratégias de herança no JPA: – JOINED: uma tabela para cada entidade, não repete os campos. – SINGLE_TABLE: apenas uma tabela para todas as classes. – TABLE_PER_CLASS: uma tabela para cada classe, repetindo todos os campos.
  • 21. Classe Cliente • Para mostrar o funcionamento da herança no JPA, crie a classe Cliente, subclasse de Usuario. • Não é necessário redefinir o Id, que já está na superclasse. @Entity public class Cliente extends Usuario { @Column(unique = true, nullable = false) private String cpfCnpj; {sets e gets} }
  • 22. Teste do Cliente • Agora, crie a classe TesteInsereCliente para testar a nova entidade. • Não se esqueça dos métodos de inicialização e finalização. • A título de teste, comente a linha do cpfCnpj e veja o resultado. @Test public void inserirCliente() { Cliente cliente = new Cliente(); cliente.setEmail("jose@oracle.com"); cliente.setNome("Jose Carlos"); // cliente.setCpfCnpj("123456"); em.persist(cliente); Assert.assertTrue("Cliente gravado com sucesso", cliente.getId() > 0); }
  • 23. Como funciona • Acompanhando o log do Hibernate podemos verificar que foram incluídos 2 registros, um na tabela Usuario e outro na tabela Cliente. • Isso porque a estratégia de herança selecionada foi JOINED. Hibernate: insert into Usuario (id, email, nome, ultimoLogin) values (default, ?, ?, ?) Hibernate: insert into Cliente (cpfCnpj, id) values (?, ?)
  • 24. Atividade • Crie as classes de teste Categoria: – Inclusão. – Alteração. – Exclusão. – Consulta todas as categorias.
  • 25. Relacionamentos • O JPA tem as seguintes multiplicidades, seguindo o modelo relacional: – many-to-one. – one-to-one. – one-to-many. – many-to-many.
  • 26. Many-to-one • O relacionamento many-to-one está presente na classe produto. • Segundo o modelo, cada produto deve ter uma categoria. public class Produto { @Id @GeneratedValue private Long id; @ManyToOne private Categoria categoria; private String nome; private String descricao; private String especificacaoLoja; @Lob private byte[] especificacaoFabricante; private Double preco; }
  • 27. Inserindo produtos • Para inserir um produto precisamos escolher uma categoria válida. • O primeiro passo é pesquisar uma categoria já cadastrada. • Em seguida podemos preencher os demais atributos e persistir a entidade. @Test public void inserirProduto() { Long idCategoria = 12l; Categoria categoria = em.find(Categoria.class, idCategoria); Assert.assertNotNull("Categoria não cadastrada", categoria); Produto produto = new Produto(); produto.setCategoria(categoria); produto.setDescricao("Colcha para cama de solteiro 120cm x 210cm"); produto.setNome("Colcha para cama de solteiro"); produto.setPreco(150.00); em.persist(produto); }
  • 28. Consultando produtos • Para os exemplos seguintes crie a classe TesteConsultaProdutos. • O primeiro teste, consultarTodasCategorias, segue o mesmo princípio das demais. @Test public void consultarTodosProdutos() { System.out.println("Consultar todos os produtos"); List<Produto> produtos = em.createQuery("from Produto").getResultList(); for (Produto p : produtos) { System.out.println(p.getId() + " - " + p.getNome()); } }
  • 29. Consultando produtos pela categoria • O exemplo abaixo mostra os produtos de uma categoria específica. • Este teste usa uma Query, mas poderia ser facilmente adaptado para utilizar NamedQuery. @Test public void consultarProdutosPelaCategoria() { System.out.println("Consultar produtos pela categoria"); Long idCategoria = 12l; List<Produto> produtos = em .createQuery("from Produto where categoria.id = ?1") .setParameter(1, idCategoria ).getResultList(); for (Produto p : produtos) { System.out.println(p.getId() + " - " + p.getNome()); } }
  • 30. Consultando quantidades • Adicione as NamedQueries abaixo em Produto e o teste na classe TesteConsultaProdutos. @NamedQueries({ @NamedQuery(name = "produto.consultaTotalPorCategoria", query = "select count(p) from Produto p where categoria.id = :idCategoria"), @NamedQuery(name = "produto.consultaPorIntervaloPreco", query = "from Produto where preco >= ?1 and preco <= ?2") }) @Test public void consultarTotalProdutoPelaCategoria() { System.out.println("Consultar total de produtos pela categoria"); Query query = em.createNamedQuery("produto.consultaTotalPorCategoria"); Long idCategoria = 12l; query.setParameter("idCategoria", idCategoria); Object resultado = query.getSingleResult(); System.out.println("Total de produtos na categoria: " + resultado); }
  • 31. Atividades • Criar o teste unitário para a NamedQuery 'produto.consultaPorIntervaloPreco' na classe TesteConsultaProdutos. • Criar as classes abaixo, com seus relacionamentos, atributos e testes unitários. – Venda (id, data, cliente). – Item (id, produto, quantidade, valorUnitario, venda).