JPA DAO Genérico e JPQL

Documentos relacionados
JPQL (Java Persistence Query language)

JPA Com Hibernate. Paulo Ricardo Lisboa de Almeida. 1 Universidade Positivo

JPA Java Persistence API. Prof. Ramon Chiara

JPA Demonstração das estratégias optimistic locking e pessimistic locking

API JDBC. Paulo Ricardo Lisboa de Almeida. 1 Universidade Positivo

JPA Demonstração das Estratégias Optimistic Locking e Pessimistic Locking

Introdução. Configuração. Padrão POJO. Framework Pesistência de. Mapeamento Annotation. Objetos. Persistência. Java. Objetos. Prof.

Mapeamento da herança em JPA

Mapeamento Lógico/Relacional com JPA

Consultas com Java Persistence Query Language. Prof. Fellipe Aleixo

Java Persistence Query Language JPQL

Laboratório de Programação. Aula 12 Java 5COP088. Aula 12 Exceções Prof. Dr. Sylvio Barbon Junior. Sylvio Barbon Jr

Hibernate na sua aplicação JavaWeb

Aula Prática JBCD - Introdução

Tratamento de Exceção. Programação Orientada a Objetos Java (Rone Ilídio)

Agenda. Instalação e configuração. Processamento de comandos SQL com JDBC. Driver JDBC Criação da classe de conexão

JPA: Persistência padronizada em Java

Desenvolva de qualquer sistema operacional para qualquer sistema operacional. Sem limites.

De forma simples, para a execução de comandos SQL com JDBC, precisa-se da instancia de três classes Java. São elas: Nome da classe Função

Tecnologias Java JDBC. Marcio Seiji Oyamada

Tratamento de Erros. Sérgio Luiz Ruivace Cerqueira

UFG - Instituto de Informática

Framework Hibernate/JPA

DATA ACCESS OBJECT (DAO)

Atributos e Métodos Estáticos

Padrão J2EE Data Access Object (DAO)

Linguagem de Programação II Implementação

Tipos, Literais, Operadores

Tipos, Literais, Operadores

Repositórios JPA no Projeto ecafeteria

Coisas que você não sabia sobre Generics

@Table(name= Nome-da-tabela ) usada quando os nomes da classe e da tabela são diferentes.

ANÁLISE E PROJETO DE BANCO DE DADOS

Lista de Exercícios da disciplina Aplicações de Linguagem de Programação Orientada a objetos

Programação de Computadores II TCC /Turma A 1

APIs Java: Tratamento de exceções e Coleções

1 - O que será impresso quando o seguinte programa escrito na linguagem JAVA for compilado e executado?

JDBC - Java Data Base Connectivity


INF1636 PROGRAMAÇÃO ORIENTADA A OBJETOS

Tratamento de Exceções

Classe. Objeto é uma instância de uma classe. Classe é onde conceituamos o objeto É a essência do objeto Define os atributos e métodos

1) Responda de acordo com os conceitos de orientação a objetos (0,5).

INF1337 LINGUAGEM DE PROGRAMAÇÃO ORIENTADA A OBJETOS

[Desenvolvimento OO com Java] Exceções e controle de erros

Sistemas Operacionais

Controlando Erros com Exceções

Conexão com Banco de Dados

Programação de Computadores II

TRATAMENTO DE EXCEÇÕES

Tratamento de Exceções

Desenvolvimento Web com Java. Sérgio Lopes Caelum -

PROJETO ECLIPSE: Estrutura do projeto: (Dynamic Web Project) LIBS: Java WebDeveloper. Prof. Edson Belém

JPA - Java Persistence API. Entity. Entity Campos e Propriedades Entity Chaves Primárias Entity Associações. Entity Manager


JPA - Java Persistence API. Entity. Entity Campos e Propriedades Entity Chaves Primárias Entity Associações. Entity Manager

Utilizando Swing com Hibernate

Recapitulando. Construtores: (Overload assinatura) public Circle() {...} public Circle(double x, double y, double r) {... }

Sabemos que a classe é responsável por definir a estrutura e o comportamento de seus objetos. Portanto, os objetos são instâncias das classes.

UNIVERSIDADE FEDERAL DE MATO GROSSO DO SUL SISTEMAS DE INFORMAÇÃO - CÂMPUS DE COXIM FUNDAMENTOS EM ORIENTAÇÃO A OBJETOS

Classes e Objetos. Prof. Fernando V. Paulovich 9 de agosto de 2010

Aula Prática Criando Views e Controles

Universidade de Mogi das Cruzes Implementação Orientada a Objetos - Profª. Danielle Martin. Guia da Sintaxe do Java

Linguagem de Programação II Implementação

JPA Com Hibernate. Paulo Ricardo Lisboa de Almeida. Dados Transientes e Relacionamentos. 1 Universidade Positivo

Criar uma aplicação JPA2 com EclipseLink e H2

Threads. O que é uma Thread? Paralelismo

Exceções. SCC0504 Programação Orientada a Objetos. Luiz Eduardo Virgilio da Silva ICMC, USP

Módulo 5. Programação Orientada a Objetos. Programação Orientada a Objetos I Java (Rone Ilídio)

UFG - Instituto de Informática

Armazendando Senhas Com Funções de Hash

Programação Orientada a Objetos SANTOS, Rafael (PLT)

JAVA ENTERPRISE EDITION: CRIAR BEANS DE ENTIDADE A PARTIR DE TABELAS

Introdução. Atributos em Java. Atributos. Acesso à atributos em Java. Atributo versus variável. Atributos, métodos e encapsulamento.

JPA Com Hibernate Aula 2

Programação. Orientada a Objetos: Herança. Objetos. Relacionamento entre classes. Análise e Projeto Orientados a. Objetos

Linguagem Algorítmica OO. Linguagem Algorítmica

9 Exceções. Desenvolvimento OO com Java. Vítor E. Silva Souza ~ vitorsouza

Universidade Federal de Uberlândia Faculdade de Computação Programação Orientada a Objetos II Prof. Fabiano Dorça. Padrão Observer (Observador)

Herança. Fátima L. S. Nunes Luciano A. Digiampietri Norton T. Roman SISTEMAS DE INFORMAÇÃO 1

Evento.java. package dominio;

Hibernate. Mapeamento O/R Marcio Aguiar Ribeiro

UNIP - Ciência da Computação e Sistemas de Informação. Estrutura de Dados. AULA 5 Pilhas

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Lista 05 Herança. public class PessoaFisica extends Pessoa { private String RG; public PessoaFisica(){ super(); } public String getrg(){ return RG; }

Quando um programa viola as restrições semânticas da linguagem, a JVM assinala um erro ao programa, sob a forma de exceção.

Encapsulamento e Métodos (Construtores e Estáticos) João Paulo Q. dos Santos

Herança. Universidade Católica de Pernambuco Ciência da Computação. Prof. Márcio Bueno.

Tratamento de Exceções em Java

Armazenando Dados em Aplicações Java Parte 3 de 3: Analisando as opções

Fundamentos Básicos da linguagem Java (Programação Orientada a Objetos) Prof. Responsáveis Wagner Santos C. de Jesus

Programação Orientada a Objetos. Vagner Luz do Carmo - Vluzrmos

Tratamento de Exceções. LPG II Java. Tratamento de Exceções. Conceito de Exceções. Exemplo

Análise e Projeto Orientados por Objetos

AULA 07 HIBERNATE. Ao término desse capítulo você terá aprendido: Fundamentos do MVC Estrutura dos pacotes no NetBeans

Programação Orientada a Objetos Classes e Objetos. Prof. Vicente Paulo de Camargo

Tratamento de Exceções cont. Profa. Thienne Johnson EACH/USP

Persistência. Prof. Alberto Costa Neto Linguagens de Programação. Departamento de Computação Universidade Federal de Sergipe

Programação Estruturada e Orientada a Objetos. Objetos e Métodos

Transcrição:

JPA DAO Genérico e JPQL Paulo Ricardo Lisboa de Almeida 1

Criando um DAO JPA public abstract class GenericDAO<ID,U>{... Onde T definirá a chave dos objetos, e U definirá os objetos em si (da mesma forma que no IGeneriDAO criado para o JDBC) 2

Atributos do Generic DAO Atributos O que significa o EntitymanagerFactory ser static final? private static final EntityManagerFactory emf = Persistence.createEntityManagerFactory("clinica_pu"); private EntityManager em; private Class<U> entityclass; 3

Atributos do Generic DAO Atributos O que significa o EntitymanagerFactory ser static final? Temos somente um factory para a aplicação inteira Instanciar o factory é extremamente custoso. Portanto ele deve ser criado somente uma vez private static final EntityManagerFactory emf = Persistence.createEntityManagerFactory("clinica_pu"); private EntityManager em; private Class<U> entityclass; 4

O Construtor public GenericDAO(Class<U> entityclass) { this.entityclass = entityclass; 5

Métodos Básicos da Classe public void begintransaction() { em = emf.createentitymanager(); em.gettransaction().begin(); public void commit() { em.gettransaction().commit(); public void rollback() { em.gettransaction().rollback(); public void rollbackandclosetransaction() { try{ this.em.gettransaction().rollback(); finally{ this.closetransaction(); 6

Métodos Básicos da Classe private void closetransaction() { this.em.close(); public void commitandclosetransaction() { try{ this.commit(); finally{ this.closetransaction(); public void flush() { em.flush(); 7

Métodos Para Manipulação de Objetos public void save(u entity) { em.persist(entity); public void delete(u entity) { em.refresh(entity); em.remove(entity); public U update(u entity) { return em.merge(entity); public U find(id entityid) { return em.find(entityclass, entityid); public U findreferenceonly(id entityid) { try{ return em.getreference(entityclass, entityid); catch(entitynotfoundexception e){ return null; 8

Quando e como fechamos o EntityManagerFactory? Pode-se capturar um evento de fechamento da aplicação e fechar o factory Pode-se também utilizar APIs que gerenciam o factory automaticamente, criar um FactoryUtils, etc. No exemplo, o factory deverá ser fechado manualmente através do método do GenericDAO: public static void fecharentitymanagerfactory(){ emf.close(); 9

Estendendo o DAO public class PessoaDAO extends GenericDAO<Integer, Pessoa>{ public PessoaDAO() { super(pessoa.class); 10

Utilizando o DAO public static void main(string[] args) { PessoaDAO pessoadao = new PessoaDAO(); try{ pessoadao.begintransaction(); Pessoa p = pessoadao.find(6); System.out.println(p.getNome()); for(animal a : p.getanimais()) System.out.println(a.getNome()); pessoadao.commitandclosetransaction(); System.out.println("Fim!!!"); catch(exception e){ pessoadao.rollbackandclosetransaction(); e.printstacktrace(); finally{ GenericDAO.fecharEntityManagerFactory(); System.out.println("Saindo!!!"); 11

JPQL Java Persistence Query Language Forma de fazer consultas orientadas a objetos Independente de banco de dados Flexibilidade nas consultas 12

JPQL - EXEMPLO public class PessoaDAO extends GenericDAO<Integer, Pessoa>{ public List<Pessoa> listar(){ String sql = "select p from Pessoa p"; Query query = super.getentitymanager().createquery(sql);... @SuppressWarnings("unchecked") List<Pessoa> retorno = query.getresultlist(); return retorno; Repare que no comando select Pessoa se refere a classe Pessoa (inclusive o P de Pessoa necessariamente deve ser maiúsculo, como o nome na classe) e não a tabela pessoa do banco de dados. 13

@SuppressWarnings("unchecked") Type safety: The expression of type List needs unchecked conversion to conform to List<Pessoa> PessoaDAO.java Não é possível verificar em tempo de compilação o tipo T da lista retornada por getresultlist Type Erasure https://docs.oracle.com/javase/tutorial/java/generics/erasu re.html O Generic em Java não é covariante http://docs.oracle.com/javase/tutorial/extra/generics/subty pe.html @SuppressWarnings("unchecked") List<Pessoa> retorno = query.getresultlist(); 14

JPQL Queries mais complexas Exemplo de método para retornar uma lista de pessoas que possuem animais de um tipo específico: public List<Pessoa> listarpessoasquepossuemtipoanimal(integer idtipoanimal){ String sql = "select p from Pessoa p" + " inner join p.animais a" + " where a.tipoanimal.id = :idtipoanimal" + " group by p"; Query query = super.getentitymanager().createquery(sql); query.setparameter("idtipoanimal", idtipoanimal); @SuppressWarnings("unchecked") List<Pessoa> retorno = query.getresultlist(); return retorno; 15

JPQL Queries mais Complexas Note o bind entre o parâmetro : idtipoanimal e o identificador do tipoanimal especificado pelo query.setparameter("idtipoanimal", idtipoanimal); 16

Join Fetch Caso seja necessário criar uma consulta JPQL que busque uma pessoa e sua lista de animais de maneira eager, devese utilizar um join fetch. Ex.: public Pessoa findeager(integer id){ String sql = "select p from Pessoa p " + " inner join fetch p.animais" + " where p.id = :idpessoa"; TypedQuery<Pessoa> query = super.getentitymanager().createquery(sql, Pessoa.class); query.setparameter("idpessoa", id); try { Pessoa retorno = query.getsingleresult(); return retorno; catch (NoResultException ex) { return null; 17

TypedQuery TypedQuery é o mesmo que Query, porém o TypedQuery força o tipo retornado (no caso para pessoa), diminuindo a probabilidade de erros de programação Alguns erros podem ser pegos em tempo de compilação. 18

JPQL - Performance Ao criar uma consulta dentro de um método, como no exemplo, o código JPQL precisa ser interpretado e transformado em um código sql válido para o banco. 19

Named Query São comandos JPQL pré-processados no momento da inicialização da unidade de persistência Anotações nas classes das entidades Uma named query deve ter um nome único, portanto é uma boa prática colocar NOME_ENTIDADE.NOME_QUERY para que isso seja garantido @Entity @Table(name="pessoa") @NamedQuery (name="pessoa.findbycpf", query = " SELECT p FROM Pessoa p where p.cpf = :cpf" ) public class Pessoa {... 20

Utilizando Uma Named Query Dentro do DAO public class PessoaDAO extends GenericDAO<Integer, Pessoa>{ public Pessoa findbycpf(integer cpf){ Query query = super.getentitymanager().createnamedquery("pessoa.findbycpf"); query.setparameter("cpf", cpf);... Pessoa retorno = (Pessoa)query.getSingleResult(); return retorno; 21

Single Result query.getsingleresult() especifica que somente um item será retornado. Se não existir o item no banco, será lançada uma exceção NoResultException Retornando null caso o item não exista no banco: public Pessoa findbycpf(integer cpf){ Query query = super.getentitymanager().createnamedquery("pessoa.findbycpf"); query.setparameter("cpf", cpf); try { Pessoa retorno = (Pessoa)query.getSingleResult(); return retorno; catch (NoResultException ex) { return null; 22

Múltiplas Named QUeries Utiliza-se a anotação @NamedQueries @NamedQueries({ @NamedQuery (name="pessoa.findbycpf", query = " SELECT p FROM Pessoa p where p.cpf = :cpf" ), @NamedQuery(name="Pessoa.listSemDataNascimento", query="select p FROM Pessoa p WHERE c.nascimento is null"), ) 23

Problemas com Named Queries? public List<Pessoa> listar(boolean ordenacaoascendente){ String strorderby; if(ordenacaoascendente == true) strorderby = " order by p.nome asc"; else strorderby = " order by p.nome desc"; String sql = "select p from Pessoa p" + strorderby; Query query = super.getentitymanager().createquery(sql); @SuppressWarnings("unchecked") List<Pessoa> retorno = query.getresultlist(); return retorno; 24

Problemas com Named Queries? As consultas devem ser pré-definidas A seguinte query não pode se tornar uma named query, pois o comando é construído dinamicamente. public List<Pessoa> listar(boolean ordenacaoascendente){ String strorderby; if(ordenacaoascendente == true) strorderby = " order by p.nome asc"; else strorderby = " order by p.nome desc"; String sql = "select p from Pessoa p" + strorderby; Query query = super.getentitymanager().createquery(sql); @SuppressWarnings("unchecked") List<Pessoa> retorno = query.getresultlist(); return retorno; 25

Fim! Resolva os exercícios propostos 26