+ All Categories

02-jsf

Date post: 16-Jul-2015
Category:
Upload: adilson-vahldick
View: 182 times
Download: 1 times
Share this document with a friend
Popular Tags:

of 128

Transcript

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.


Recommended