Date post: | 16-Jul-2015 |
Category: |
Documents |
Upload: | adilson-vahldick |
View: | 182 times |
Download: | 1 times |
of 128
Prof. Adilson Vahldick ([email protected])
JAVA WEB BSICO: JSF E JPA Parte 2 : JPA
AGENDAProf. Adilson Vahldick ([email protected])
Java Database Connectivity Java Persistence API Contextos Mapeamentos bsicos Mapeamentos de relacionamentos Consultas (EJB-QL) Mapeamentos de herana
Java Database Connectivity (JDBC)Prof. Adilson Vahldick ([email protected])
Aplicao API Driver Banco de Dados
JDBC Driver e Banco de DadosProf. Adilson Vahldick ([email protected])
Distribudo como JAR Classe ponto de entrada MySQL : com.mysql.jdbc.Driver PostgreSQL: org.postgresql.Driver URL de conexoMySQL: jdbc:mysql://localhost:3306/loja PostgreSQL: jdbc:postgresql://localhost:5432/loja Oracle :
PraticandoProf. Adilson Vahldick ([email protected])
Baixe a aplicao jpa_testes e descompacte Abra esse projeto no Netbeans [Propriedades] do Projeto [Bibliotecas] e [Adicionar biblioteca...] Selecione [MySQL JDBC Driver] ou [PostgreSQL JDBC Driver] [Adicionar biblioteca] e [OK]
PraticandoProf. Adilson Vahldick ([email protected])
Java Persistence APIProf. Adilson Vahldick ([email protected])
Mapeamento Objeto-Relacional (ORM) Parte da Enterprise Java Beans (EJB)
No necessita de servidores de aplicativos Classes simples so mapeadas para tabelas Objetos persistentes Uma classe centraliza a interao entre aplicao e o framework Linguagem de consulta prpria Independncia de banco Principais fabricantes: Hibernate, Eclipse Link
PraticandoProf. Adilson Vahldick ([email protected])
[Propriedades] do Projeto [Bibliotecas] e [Adicionar biblioteca...] Selecione [Eclipse Link (JPA 2.0)] [Adicionar biblioteca] e [OK]
Gerenciamento das entidadesProf. Adilson Vahldick ([email protected])
new Novo Novo Gerenciado Gerenciado
Associado a um contexto de persistncia
Monitora as alteraes do objeto e sincroniza no banco de dados
Objeto desacoplado do contexto de persistncia Contexto de persistncia finalizado
No-Gerenciado No-Gerenciado
Mapeamento bsicoProf. Adilson Vahldick ([email protected])
public class Cliente { private long id; private String nome; private double credito; private Date dataNascimento; .... }
Mapeamento bsicoProf. Adilson Vahldick ([email protected])
@Entity
Toda classe persistvel precisa ter essa anotao
@Table(name=)
Identifica o nome da tabela. Se no aparecer, usa o nome da classe
Mapeamento bsicoProf. Adilson Vahldick ([email protected])
@Entity @Table(name=clientes) public class Cliente { private long id; private String nome; private double credito; private Date dataNascimento; .... }
Mapeamento bsicoProf. Adilson Vahldick ([email protected])
@Id Define qual atributo ser a chave primria. Toda entidade precisa ter chave primria @GeneratedValue(strategy=) Define que o atributo autoincrementvel IDENTITY: sequences e autoincrementos TABLE: tabela especfica Programador SEQUENCE: sequences (Oracle)
Mapeamento bsicoProf. Adilson Vahldick ([email protected])
.... public class Cliente { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private long id; private String nome; private double credito; private Date dataNascimento;
Mapeamento bsicoProf. Adilson Vahldick ([email protected])
@Column Configurao da coluna name length nullable, unique, insertable, updatable columnDefinition
Mapeamento bsicoProf. Adilson Vahldick ([email protected])
.... public class Cliente { ... @Column(name=cd_cliente) private long id; @Column(name=ds_cliente, length=45, nullable=false, unique=true) private String nome; @Column(name=vl_credito) private double credito; @Column(name=dt_nasc) private Date dataNascimento;
Mapeamento bsicoProf. Adilson Vahldick ([email protected])
public class Exemplo { ... @Column(name=ds_estado, columnDefinition=char(2)) private String estado; ... }
Mapeamento bsicoProf. Adilson Vahldick ([email protected])
@Temporal Atributos de java.util.Date TemporalType.TIME TemporalType.DATE TemporalType.DATETIME@Column(name=dt_nasc) @Temporal(TemporalType.DATE) private Date dataNascimento;
@Transient Atributos que no so persistidos
PraticandoProf. Adilson Vahldick ([email protected])
Aplique os mapeamentos dos slides na classe Cliente Aplique mapeamentos para a classe Produto Crie uma classe Venda com atributos para chave primria e guardar a data da venda
Java Persistence APIProf. Adilson Vahldick ([email protected])
Unidade de persistncia Mapeia um conjunto fixo de classes para UM banco de dados relacional Contm as configuraes de conexo META-INF/persistence.xmlvendas localhost:5432/loja
Cliente Cliente Venda Venda
Produto Produto
PraticandoProf. Adilson Vahldick ([email protected])
No seu banco, crie um esquema loja Boto direito sobre o projeto, e [Novo] > [Outro] Selecione [Persistence], [Unidade de persistncia] e [Prximo] No campo [Nome da unidade de persistncia] digite vendas Em [Conexo de banco de dados], selecione [Nova conexo com banco de dados]
PraticandoProf. Adilson Vahldick ([email protected])
Nome do driver: MySQL ou PostgreSQL Host: localhost Port: 3306 ou 5432 Banco de dados: loja Usurio: root ou postgres Senha: root ou postgres [OK] Caso for Postgres, na nova janela selecione [public] [Finalizar]
PraticandoProf. Adilson Vahldick ([email protected])
Unidade de persistnciaProf. Adilson Vahldick ([email protected])
org.eclipse.persistence.jpa.PersistenceProvider
PraticandoProf. Adilson Vahldick ([email protected])
Adicione as classes Cliente, Produto e Venda no mapeamento da unidade de persistncia
Gerenciamento das entidadesProf. Adilson Vahldick ([email protected])
new Novo Novo Gerenciado Gerenciado
Associado a um contexto de persistncia
Monitora as alteraes do objeto e sincroniza no banco de dados
Objeto desacoplado do contexto de persistncia Contexto de persistncia finalizado
Cliente c = new Cliente(); c.setNome(Adilson); c.setCredito(100); ..... EntityManager em = ..... em.persist(c); c.setNome(Adilson Vahldick); ....
No-Gerenciado No-Gerenciado
Obter um contexto de persistnciaProf. Adilson Vahldick ([email protected])
JavaSE Persistence.createEntityManagerFactory( String unitName):EntityManagerFactory; Persistence.createEntityManagerFactory( String unitName, Map properties):EntityManagerFactory;persistence.xml
EntityManagerFactory emf; emf = Persistence.createEntityManagerFactory(vendas); EntityManager em = emf.createEntityManager();Contexto de persistncia
Nesse instante que Nesse instante que feito o feito o carregamento carregamento das configuraes e das configuraes e conexo com o BD. conexo com o BD.
PraticandoProf. Adilson Vahldick ([email protected])
Na classe JPAUtil Crie um atributo EntityManagerFactory e outro EntityManager Implemente o mtodo conectarPadrao(String): Crie um EntityManagerFactory e guarde no atributo. Passe como parmetro nomeUnid Crie um EntityManager e guarde em um atributo Implemente o mtodo getEntityManager() No mtodo fechar(): Feche o EntityManager Feche o EntityManagerFactory
PraticandoProf. Adilson Vahldick ([email protected])
Execute a aplicao (classe Principal) Acesse o seu banco de dados e observe as tabelas automaticamente criadas
Interao com EntityManagerProf. Adilson Vahldick ([email protected])
Trabalhar com transaes Incluir, alterar ou excluir um objeto Carregar um objeto do banco
Trabalhar com transaesProf. Adilson Vahldick ([email protected])
em.getTransaction().begin(); ... obj = new Xpto(); obj.setAbc(123); persistir objeto (obj) .... em.getTransaction().commit();
obj vira entidade gerenciada
...em.getTransaction().begin(); obj.setXyz(true); em.getTransaction().commit();obj atualizado automaticamente
Incluir um objetoProf. Adilson Vahldick ([email protected])
em.persist(obj) obj enfileirado no gerenciador para insero obj considerado entidade gerenciada precisa sempre estar dentro de uma transao popula o atributo chave primriaem.getTransaction().begin(); em.persist(obj); em.getTransaction().commit();
PraticandoProf. Adilson Vahldick ([email protected])
No mtodo incluir(Object): Crie uma transao Utilize o mtodo persist() e use o objeto passado como parmetro Finalize a transao Experimente no sistema incluir um cliente: Clique em [Novo], digite algo nos campos e clique em [Salvar] Visualize o cliente na ferramenta do BD
Carregar um objetoProf. Adilson Vahldick ([email protected])
em.find(classe, chave primria):objeto Procura no banco de dados por um objeto da classe usando chave primriaCliente c = em.find(Cliente.class, 1L);
Retorna null se no encontrar
Carregar um objetoProf. Adilson Vahldick ([email protected])
em.getReference(classe, chave primria):objeto Procura no banco de dados por um objeto da classe usando chave primriaCliente c = em.getReference(Cliente.class, 1L);
Dispara exceo se no encontrar o objeto
getReference() x find()Prof. Adilson Vahldick ([email protected])
find(): devolve o objeto totalmente carregado getReference(): devolve uma referncia. Ao acessar qualquer atributo do objeto, ento ele carregado do banco
Cliente c = em.getReference(Cliente.class, 1L); System.out.println(c.getNome()); aqui que carrega o objeto do banco de dados
Carregamento em entidade gerenciadaProf. Adilson Vahldick ([email protected])
em.getTransaction().begin(); obj = em.find(Cliente.class, 1L); ... obj2 = em.find(Cliente.class, 1L); em.getTransaction().commit();
obj uma entidade gerenciada
obj2 == obj
obj1
:Clienteobj2
TransaesProf. Adilson Vahldick ([email protected])
em.getTransaction().begin(); Cliente c = em.find(...); em.getTransaction().commit(); em.getTransaction().begin(); c.setCredito(500); em.getTransaction().commit();O contexto percebe que houve alterao nos seus objetos
PraticandoProf. Adilson Vahldick ([email protected])
Implemente o mtodo procurar() Preenche o campo do lado do boto [Buscar], e clique nesse boto No evento do boto [Transao], inclua as linhas para incio e fim da transao, e teste o boto
Atualizar objeto do banco de dadosProf. Adilson Vahldick ([email protected])
refresh(objeto) Recarrega o objeto com os dados do bancoem.refresh(cliente);
Mesclando entidadesProf. Adilson Vahldick ([email protected])
merge(objeto):objeto Normalmente utilizado para devolver o objeto ao modo de gerenciado, e marc-lo para alterao.em.getTransaction().begin(); o2 = em.merge(o1); em.getTransaction().commit();
o1 no gerenciado: o2 um novo objeto contendo os dados de o1 o1 gerenciado: o2 e o1 apontam para mesmo objeto
Mesclando entidadesProf. Adilson Vahldick ([email protected])
merge(objeto):objeto Se chave primria == 0 ento insere o objeto no banco id atualizado no objeto de retorno seno altera o objeto no banco
PraticandoProf. Adilson Vahldick ([email protected])
Implemente o mtodo recarregar() Na janela, use o recurso [Buscar], digite algo nos campos e clique em [Recarregar] Implemente o mtodo alterar() Na janela, use o recurso [Buscar], altere os campos do cliente e clique em [Salvar] Visualize o cliente na ferramenta do BD
ExcluindoProf. Adilson Vahldick ([email protected])
remove(objeto) Exclui a linha relacionada ao objeto, e tira do estado de gerenciado.em.remove(cliente);
PraticandoProf. Adilson Vahldick ([email protected])
Implemente o mtodo excluir() Na janela, use o recurso [Buscar], e clique em [Excluir]
PraticandoProf. Adilson Vahldick ([email protected])
Desenvolva uma classe com mtodo main para acessar os dados dos produtos Crie um JPAUtil e conecte Crie trs Produtos e inclua Feche o JPAUtil Conecte novamente Altera o preo unitrio do primeiro produto Feche o JPAUtil
Sete tipos de relacionamentosProf. Adilson Vahldick ([email protected])
1. Unidirecional de um-para-um 2. Bidirecional de um-para-um 3. Unidirecional de muitos-para-um 4. Bidirecional de muitos-para-um 5. Unidirecional de um-para-muitos 6. Bidirecional de um-para-muitos 7. Bidirecional de muitos-para-muitos
Relacionamento um-para-umProf. Adilson Vahldick ([email protected])
Unidirecional
Bidirecional
Relacionamento unidirecional um-para-umProf. Adilson Vahldick ([email protected])
public class Cliente { private Endereco endereco; }
Relacionamento unidirecional um-para-umProf. Adilson Vahldick ([email protected])
public class Cliente { ... @OneToOne(cascade={CascadeType.ALL}) @JoinColumn(name=cd_endereco) private Endereco endereco; ... }
Relacionamento unidirecional um-para-umProf. Adilson Vahldick ([email protected])
@OneToOne(cascade=... , optional=false) Mapeia uma associao para relacionamento de um-para-um. Padro do optional true. @JoinColumn(name=) Define o nome da coluna chave estrangeira. No pode usar @Column()
Relacionamento unidirecional um-para-umProf. Adilson Vahldick ([email protected])
public class Cliente { ... @OneToOne(cascade={CascadeType.ALL}) @JoinColumn(name=cd_endereco) private Endereco endereco; ... }
Relacionamento um-para-umProf. Adilson Vahldick ([email protected])
Unidirecional
Bidirecional
Relacionamento bidirecional um-para-umProf. Adilson Vahldick ([email protected])
public class Endereco { ... @OneToOne(mappedBy=endereco, cascade=CascadeType.ALL) private Cliente cliente; ... }
Relacionamento bidirecional um-para-umProf. Adilson Vahldick ([email protected])
Cliente c = new Cliente(); c.setNome(...); Endereco e = new Endereco(); e.setRua(...); c.setEndereco(e); e.setCliente(c); em.persist(c);public void setEndereco(Endereco e) { this.endereco = e; endereco.setCliente(this); }
Relacionamento bidirecional um-para-umProf. Adilson Vahldick ([email protected])
Cliente c = em.find(Cliente.class, 1L); System.out.println(c.getEndereco().getNome()); Endereco e = em.find(Endereco.class, 1L); System.out.println(e.getCliente().getNome());
Praticando (1)Prof. Adilson Vahldick ([email protected])
Crie uma classe de testes com mtodo main Crie uma varivel para receber uma instncia de JPAUtil Conecte JPAUtil com vendas Crie um objeto Cliente e popule Invoque o mtodo incluir Verifique no banco o cliente
Praticando (2)Prof. Adilson Vahldick ([email protected])
Crie uma classe Cartao de Credito contendo como atributos: Nmero do carto Cdigo de segurana Data de validade Crie um relacionamento bidirecional com a classe Cliente Na classe de testes: Crie um objeto CartaoCredito e popule Faa a associao entre eles Invoque o mtodo incluir() passando o Cliente Verifique no banco
RelacionamentosProf. Adilson Vahldick ([email protected])
Unidirecional Muitos-Para-Um
Unidirecional Um-Para-Muitos
Bidirecional Um-Para-Muitos ou Bidirecional Muitos-Para-Um
Relacionamento muitos-para-umProf. Adilson Vahldick ([email protected])
@ManyToOne(cascade=... , optional=false) Mapeia uma associao para relacionamento de muitos-para-um. Padro do optional true.
O comportamento o mesmo do OneToOne. A diferena est no bidirecional (veremos mais adiante).
Relacionamento unidirecional muitos-para-umProf. Adilson Vahldick ([email protected])
@Entity @Table(name=itensvenda) public class ItemVenda { ... @ManyToOne(optional=false) @JoinColumn(name="cd_produto") private Produto produto; ... }
Praticando (1)Prof. Adilson Vahldick ([email protected])
Acerte os mapeamentos da classe ItemVenda Inclua o mapeamento para a classe Produto
Praticando (2)Prof. Adilson Vahldick ([email protected])
Crie uma classe Dependente com atributos: Nome Sexo: tipo enumerado com MASC e FEM. Usar anotao @Enumerated(EnumType.ORDINAL)
Crie uma associao muitos-para-um de Dependente para cliente Use a classe de testes para fazer incluses Inclua dois clientes com alguns dependentes
Relacionamento um-para-muitosProf. Adilson Vahldick ([email protected])
@OneToMany(cascade=... ) Mapeia uma associao para relacionamento de um-para-muitos. A associao precisa ser do tipo: java.util.Collection java.util.List java.util.Map java.util.Set
Relacionamento unidirecional um-para-muitosProf. Adilson Vahldick ([email protected])
public class Venda { ... @OneToMany(cascade=CascadeType.ALL) @JoinColumn(name="cd_venda") private List itensVendas = new ArrayList(); ... }
Relacionamento unidirecional um-para-muitosProf. Adilson Vahldick ([email protected])
Venda v = new Venda(); ItemVenda iv = new ItemVenda(); iv.setPcoUnit(1); iv.setQtdade(10); v.getItensVendas().add(iv); em.persist(v);
Relacionamento unidirecional um-para-muitosProf. Adilson Vahldick ([email protected])
Venda v = em.find(Venda.class, 1L); ItemVenda iv = v.getItensVendas().remove(0); em.remove(iv);
PraticandoProf. Adilson Vahldick ([email protected])
Acerte a classe Venda Crie uma classe Prateleira com atributos: Rua Estante Faa uma associao um-para-muitos com Produto
Use a classe de testes para experimentar os mapeamentos com incluses Inclua duas prateleiras com alguns produtos
Relacionamentos bidirecionaisProf. Adilson Vahldick ([email protected])
public class Venda { ... @OneToMany(cascade=CascadeType.ALL, mappedBy=venda) private List itensVendas = new ArrayList(); public void addItemVenda(ItemVenda iv) { itensVendas.add(iv); iv.setVenda(this); } } public class ItemVenda { ... @ManyToOne(cascade=CascadeType.ALL) @JoinColumn(name=cd_venda) private Venda venda; ... }
Relacionamentos bidirecionaisProf. Adilson Vahldick ([email protected])
Venda v = new Venda(); ItemVenda iv = new ItemVenda(); iv.setPcoUnit(1); iv.setQtdade(10); v.addItemVenda(iv); em.persist(v); ---Venda v = em.find(Venda.class, 1L); ItemVenda iv = v.getItensVendas().get(0); System.out.println(iv.getVenda());
PraticandoProf. Adilson Vahldick ([email protected])
Acerte a associao entre ItemVenda e Venda Crie uma associao bidirecional entre Cliente e Dependente
Use a classe de testes para experimentar os mapeamentos com incluses: Inclua duas vendas com alguns itens Inclua um cliente com dois dependentes
EJB QLProf. Adilson Vahldick ([email protected])
Linguagem semelhante a SQL Orientada a objetos Gerenciador de entidade converte uma expresso EJB QL em uma ou vrias expresses SQL Independente de banco de dados
EntityManagerProf. Adilson Vahldick ([email protected])
createQuery(String): Query Cria um objeto Query se baseando na expresso passada como parmetro createNamedQuery(String): Query Cria um objeto Query buscando uma expresso de acordo com o nome passado como parmetro Cuidado com o import: javax.persistence.Query
EntityManager.createQuery()Prof. Adilson Vahldick ([email protected])
Query q = em.createQuery( select c from Cliente c + where c.nome like 'A%'); Cliente c = (Cliente) em.getSingleResult();
Dispara exceo se no achar Dispara exceo se achar mais de um
EntityManager.createQuery()Prof. Adilson Vahldick ([email protected])
Query q = em.createQuery( select c from Cliente c + where c.nome like 'A%'); List l = em.getResultList();
Se no houver entidades, retorna lista vazia
ParmetrosProf. Adilson Vahldick ([email protected])
Query q = em.createQuery( select c from Cliente c + where c.nome like :nome); q.setParameter(nome, A%);
Query q = em.createQuery( select c from Cliente c + where c.dataNascimento = :data); q.setParameter(data, sdf.parse(10/01/1990), TemporalType.DATE);
PraticandoProf. Adilson Vahldick ([email protected])
Crie uma classe simples com mtodo main Crie um objeto JPAUtil e conecte com vendas Acessando o EntityManager, crie queries para:
Mostrar o produto de cdigo 1 Listar todos os produtos cadastrados que possuem uma certa quantidade em estoque Listar todos os clientes de acordo com o nome de uma rua
Praticando na aplicaoProf. Adilson Vahldick ([email protected])
JPAUtil.listarTodos()Query q = em.createQuery("select x from " + classe.getSimpleName() + " x"); return q.getResultList();
Tirar o comentrio do getValueAt() do ClientesTableModel
Paginao de resultadosProf. Adilson Vahldick ([email protected])
Query q = em.createQuery(... ); q.setMaxResults(10); q.setFirstResult(31); List l = q.getResultList();
Consultas NomeadasProf. Adilson Vahldick ([email protected])
@NamedQueries({ @NamedQuery(name=xpto, query=select...), @NamedQuery(name=..., query=...) }) public class Cliente { ... } ---Query q = em.createNamedQuery(xpto); ...
PraticandoProf. Adilson Vahldick ([email protected])
Crie consultas nomeadas com aquelas criadas no exerccio anterior: Uma para classe Cliente Duas para classe Produto
Na classe de testes, experimente executar essas consultas utilizando seus nomes
EJB QLProf. Adilson Vahldick ([email protected])
EJB QLProf. Adilson Vahldick ([email protected])
Query q; q = em.createQuery("select v from Venda v"); List vs = q.getResultList(); Venda v = vs.get(0); System.out.println(v.getData());
Sada: SELECT cd_venda, dt_venda FROM vendas
EJB QLProf. Adilson Vahldick ([email protected])
Query q; q = em.createQuery("select v from Venda v"); List vs = q.getResultList(); Venda v = vs.get(0); System.out.println(v.getData()); System.out.println(v.getItensVendas().size());
Sada: SELECT cd_venda, dt_venda FROM vendas + 4 selects
FetchTypeProf. Adilson Vahldick ([email protected])
@OneToMany(fetch=FetchType.LAZY)
FetchType: LAZY ou EAGER EAGER: carrega imediatamente o objeto relacionado LAZY: carrega somente quando necessrio. Problema: entidade desacoplada com relacionamentos no carregados. crtico em aplicaes web !!!
Praticando FetchTypeProf. Adilson Vahldick ([email protected])
Classe Venda:
@OneToMany(cascade=CascadeType.ALL, mappedBy="venda" , fetch=FetchType.EAGER) private List itensVendas = new ArrayList();
Classe de Testes://System.out.println(v.getItensVendas().size());
Sada: SELECT cd_venda, dt_venda FROM vendas + 4 selects
EJB QL Selecionando colunasProf. Adilson Vahldick ([email protected])
Query q; q = em.createQuery("select v.data from Venda v"); List vs = q.getResultList(); Date d = vs.get(0); System.out.println(d);
EJB QL Selecionando colunasProf. Adilson Vahldick ([email protected])
Query q; q = em.createQuery( "select c.nome, c.credito from Cliente c"); List vs = q.getResultList(); Object[] colunas = vs.get(0); String nome = (String) colunas[0]; double credito = (Double) colunas[1];
EJB QL Selecionando colunasProf. Adilson Vahldick ([email protected])
Query q; q = em.createQuery( "select c.nome, c.credito, c.endereco,"+ "c.endereco.rua from Cliente c"); List vs = q.getResultList(); Object[] colunas = vs.get(0); String nome = (String) colunas[0]; double credito = (Double) colunas[1]; Endereco endereco = (Endereco) colunas[2]; String rua = (String) colunas[3];
EJB QL Criando objetos (1)Prof. Adilson Vahldick ([email protected])
package modelo; public class ClienteSistemaX { private String nome, rua, numeroCartao; public ClienteSistemaX(String nome, String rua, String numeroCartao) { this.nome = nome; this.rua = rua; this.numeroCartao = numeroCartao; } // getters ... }
EJB QL Criando objetos (2)Prof. Adilson Vahldick ([email protected])
Query q; q = em.createQuery("select "+ "new modelo.ClienteSistemaX(c.nome, "+ "c.endereco.rua, "+ "c.cartaoCredito.numeroCartao) "+ "from Cliente c"); List ls = q.getResultList(); ClienteSistemaX cx = ls.get(0); System.out.println(cx.getNome() + " " + cx.getRua() + " " + cx.getNumeroCartao());
EJB QL Selecionando itens de uma coleoProf. Adilson Vahldick ([email protected])
O nome dos produtos vendidos com a data da venda:
SQL: select ds_produto, dt_venda from vendas join itensvenda using (cd_venda) join produtos using (cd_produto) EJB-QL:select iv.produto.descricao, v.data from Venda v JOIN v.itensVenda iv
EJB QL DistinctProf. Adilson Vahldick ([email protected])
O nome dos produtos vendidos:
EJB-QL: select distinct iv.produto.descricao from ItemVenda iv
EJB QL BetweenProf. Adilson Vahldick ([email protected])
Vendas do ms de maro de 2011:q = em.createQuery("select v from Venda v "+ "where v.data between :d1 and :d2"); q.setParameter("d1", sdf.parse("01/03/2011"), TemporalType.DATE); q.setParameter("d2", sdf.parse("31/03/2011"), TemporalType.DATE);
EJB QL IS NULLProf. Adilson Vahldick ([email protected])
Clientes sem endereo:
EJB-QL: select c from Cliente c where c.endereco is null
Clientes com endereo:
EJB-QL: select c from Cliente c where c.endereco is not null
EJB QL INProf. Adilson Vahldick ([email protected])
Clientes que morem no Sul do Brasil:
EJB-QL: select c from Cliente c where c.endereco.estado in('PR', 'SC', 'RS')
Clientes que no morem no Sul do Brasil:
EJB-QL: select c from Cliente c where c.endereco.estado not in('PR', 'SC', 'RS')
EJB QL Funes agregadasProf. Adilson Vahldick ([email protected])
count, max, min, avg, sum
EJB-QL: select count(iv), count(distinct iv.produto), sum(iv.pcoUnit), max(iv.pcoUnit) from ItemVenda iv
EJB QL AgrupamentoProf. Adilson Vahldick ([email protected])
Produtos vendidos com o seu total:
EJB-QL: select iv.produto, sum(iv.pcoUnit*iv.qtdade) from ItemVenda iv group by iv.produto
Produtos com total de vendas maior que R$10
EJB-QL: select iv.produto, sum(iv.pcoUnit*iv.qtdade) from ItemVenda iv group by iv.produto having sum(iv.pcoUnit*iv.qtdade) >10
EJB QL OrdenaoProf. Adilson Vahldick ([email protected])
Produtos vendidos em ordem da descrio:
EJB-QL: select iv.produto.descricao, iv.qtdade from ItemVenda iv order by iv.produto.descricao desc
EJB QL SubconsultasProf. Adilson Vahldick ([email protected])
Usado nas clusula WHERE e HAVING
EJB-QL: select iv.produto.descricao from ItemVenda iv where iv.pcoUnit > (select avg(i.pcoUnit) from ItemVenda i)
Referenciar na subconsulta objetos da consulta externa
EJB-QL: select v from Venda v where (select sum(iv.pcoUnit) from v.itensVenda iv) > 12
EJB QL Subconsultas ALL, ANY, EXISTSProf. Adilson Vahldick ([email protected])
Listar as vendas em que todas as qtdades > 3
EJB-QL: select v from Venda v where 3 < all (select iv.qtdade from v.itensVenda iv)
Listar as vendas em que alguma qtdade > 10
EJB-QL: select v from Venda v where 10 < any(select iv.qtdade from v.itensVenda iv)
Listar as vendas em que alguma qtdade > 10
EJB-QL: select v from Venda v where exists (select iv from v.itensVenda iv where iv.qtdade>10)
HeranaProf. Adilson Vahldick ([email protected])
Trs estratgias de mapeamento 1. Uma tabela para toda hierarquia de classes 2. Uma tabela por classe concreta 3. Uma tabela por subclasse
HeranaProf. Adilson Vahldick ([email protected])
Uma tabela para toda a hierarquia de classes
HeranaProf. Adilson Vahldick ([email protected])
Uma tabela para toda a hierarquia de classes
@Entity @Table(name="pessoas") @Inheritance(strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name="nr_tipo", discriminatorType=DiscriminatorType.INTEGER) @DiscriminatorValue("1") public class Pessoa { } ----@Entity @DiscriminatorValue("2") public class Cliente extends Pessoa { }
HeranaProf. Adilson Vahldick ([email protected])
Uma tabela por classe concreta
HeranaProf. Adilson Vahldick ([email protected])
Uma tabela por classe concreta
@Entity @Table(name="pessoas") @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) public class Pessoa { ... } ----@Entity @Table(name="clientes") public class Cliente extends Pessoa { }
HeranaProf. Adilson Vahldick ([email protected])
Uma tabela por subclasse
HeranaProf. Adilson Vahldick ([email protected])
Uma tabela por subclasse
@Entity @Table(name="pessoas") @Inheritance(strategy=InheritanceType.JOINED) @DiscriminatorColumn(name="nr_tipo", discriminatorType=DiscriminatorType.INTEGER) @DiscriminatorValue("1") public class Pessoa { ... } ----@Entity @Table(name="clientes") @DiscriminatorValue("2") public class Cliente extends Pessoa { }
Herana: vantagens e desvantagens (viso do banco)Prof. Adilson Vahldick ([email protected])
1. Uma tabela por hierarquia Vantagens: Mais simples: uma tabela s No requer junes, logo, tem um desempenho melhor Desvantagens: Falta de normalizao Todas as colunas precisam ser opcionais
Herana: vantagens e desvantagens (viso do banco)Prof. Adilson Vahldick ([email protected])
2. Uma tabela por classe concreta Vantagens: Mais fcil de ser usado em um BD legado Desvantagens: Colunas se repetem em cada tabela Necessita fazer UNION nas consultas Estratgia mais desaconselhvel
Herana: vantagens e desvantagens (viso do banco)Prof. Adilson Vahldick ([email protected])
3. Uma tabela por subclasse Vantagens: Permite modelo normalizado Colunas NOT NULL Desvantagens: Desempenho inferior que SINGLE_TABLE
Relacionamento um-para-umProf. Adilson Vahldick ([email protected])
Chave estrangeira
Chave primria chave estrangeira
Um-para-um bidirecional com chave compartilhada (1)Prof. Adilson Vahldick ([email protected])
public class Endereco { ... private long id; ... }
Um-para-um bidirecional com chave compartilhada (2)Prof. Adilson Vahldick ([email protected])
public class Endereco { ... @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="cd_cliente") public long getId() { ... } @Column(name="ds_rua", length=100, nullable=false) public String getRua() { ... } ... }
Um-para-um bidirecional com chave compartilhada (3)Prof. Adilson Vahldick ([email protected])
public class Endereco { ... public long getId() { return this.cliente.getId(); } public void setId() { } ... }
Um-para-um bidirecional com chave compartilhada (4)Prof. Adilson Vahldick ([email protected])
public class Endereco { ... @OneToOne(mappedBy=endereco) @PrimaryKeyJoinColumn() public Cliente getCliente() { return cliente; } ... }
Um-para-um bidirecional com chave compartilhada (5)Prof. Adilson Vahldick ([email protected])
public class Cliente { ... @OneToOne(cascade=CascadeType.ALL, mappedBy="cliente") private Endereco endereco; public void setEndereco(Endereco endereco) { this.endereco = endereco; endereco.setCliente(this); } ... }
PraticandoProf. Adilson Vahldick ([email protected])
1. Apague as tabelas clientes e enderecos 2. Aplique os mapeamentos em Cliente e Endereco 3. Execute a classe de Testes, descomentando o cdigo que inclui um cliente com seu endereo
Relacionamento muitos-para-muitosProf. Adilson Vahldick ([email protected])
Unidirecional
Bidirecional
Relacionamento muitos-para-muitos unidirecionalProf. Adilson Vahldick ([email protected])
public class Funcionario {
@ManyToMany @JoinTable(name="atendentes", joinColumns={@JoinColumn(name="cd_funcionario")}, inverseJoinColumns={ @JoinColumn(name="cd_cliente")}) private Set clientes = new HashSet(); }
Relacionamento muitos-para-muitos unidirecionalProf. Adilson Vahldick ([email protected])
Funcionario f = new Funcionario(); f.setNome("Joaquim"); Cliente c1 = em.find(Cliente.class, 1L); Cliente c2 = em.find(Cliente.class, 2L); f.getClientes().add(c1); f.getClientes().add(c2); em.getTransaction().begin(); em.persist(f); em.getTransaction().commit();
Relacionamento muitos-para-muitos bidirecionalProf. Adilson Vahldick ([email protected])
public class Cliente { @ManyToMany(mappedBy="clientes") private Set atendentes = new HashSet(); }
Relacionamento muitos-para-muitos bidirecionalProf. Adilson Vahldick ([email protected])
Funcionario f = em.find(Funcionario.class, 1L); Cliente c = f.getClientes().iterator().next(); Funcionario f2 = c.getAtendentes().iterator().next();
PraticandoProf. Adilson Vahldick ([email protected])
Crie a classe Funcionario com atributos id, nome e a lista de clientes. Faa os mapeamentos Acerte a associao e o mapeamento na classe Cliente Na classe de Testes: Busque dois clientes Crie um Funcionario e adicione os clientes Persista
Relacionamento com listas ordenadasProf. Adilson Vahldick ([email protected])
public class Venda { ... @OneToMany(mappedBy="venda") @OrderBy("qtdade DESC") private List itensVenda = new ArrayList(); ... }
Chaves compostasProf. Adilson Vahldick ([email protected])
ExemploPK pk = new ExemploPK(10, "Teste"); Exemplo e = em.find(Exemplo.class, pk);
Chaves compostasProf. Adilson Vahldick ([email protected])
public class ExemploPK implements Serializable { private long id; private String nome;
public ExemploPK() {} ... public boolean equals(Object o) { if (o == this) return true; if (!(o instanceof ExemploPK)) return false; ExemploPK pk = (ExemploPK)o; if (pk.id != id || !pk.nome.equals(nome)) return false; return true; } public int hashCode() { return nome.hashCode() + (int)id; }
}
RefernciaProf. Adilson Vahldick ([email protected])
BAUER, Christian. KING, Gavin. Java Persistence com Hibernate. Rio de Janeiro: Editora Cincia Moderna, 2007. BURKE, Bill. MONSON-HAEFEL, Richard. Enterprise JavaBeans 3.0. So Paulo: Pearson Prentice Hall, 2007. WHITE, Seth et al. JDBC API tutorial and reference: universal data access for the Java 2 platform. 2nd ed. Reading: Addison Wesley, 1999.