Sie sind auf Seite 1von 128

Prof. Adilson Vahldick (adilson.vahldick@udesc.

br)

JAVA WEB BSICO: JSF E JPA Parte 2 : JPA

AGENDA
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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 (adilson.vahldick@udesc.br)

Aplicao API Driver Banco de Dados

JDBC Driver e Banco de Dados


Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

Distribudo como JAR Classe ponto de entrada MySQL : com.mysql.jdbc.Driver PostgreSQL: org.postgresql.Driver URL de conexo
MySQL: jdbc:mysql://localhost:3306/loja PostgreSQL: jdbc:postgresql://localhost:5432/loja Oracle :

Praticando
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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]

Praticando
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

Java Persistence API


Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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

Praticando
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

[Propriedades] do Projeto [Bibliotecas] e [Adicionar biblioteca...] Selecione [Eclipse Link (JPA 2.0)] [Adicionar biblioteca] e [OK]

Gerenciamento das entidades


Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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 bsico
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

public class Cliente { private long id; private String nome; private double credito; private Date dataNascimento; .... }

Mapeamento bsico
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

@Entity

Toda classe persistvel precisa ter essa anotao

@Table(name=)

Identifica o nome da tabela. Se no aparecer, usa o nome da classe

Mapeamento bsico
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

@Entity @Table(name=clientes) public class Cliente { private long id; private String nome; private double credito; private Date dataNascimento; .... }

Mapeamento bsico
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

@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 bsico
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

.... public class Cliente { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private long id; private String nome; private double credito; private Date dataNascimento;

Mapeamento bsico
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

@Column Configurao da coluna name length nullable, unique, insertable, updatable columnDefinition

Mapeamento bsico
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

.... 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 bsico
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

public class Exemplo { ... @Column(name=ds_estado, columnDefinition=char(2)) private String estado; ... }

Mapeamento bsico
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

@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

Praticando
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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 API


Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

Unidade de persistncia Mapeia um conjunto fixo de classes para UM banco de dados relacional Contm as configuraes de conexo META-INF/persistence.xml
vendas localhost:5432/loja

Cliente Cliente Venda Venda

Produto Produto

Praticando
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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]

Praticando
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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]

Praticando
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

Unidade de persistncia
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

<persistence ...> <persistence-unit name="vendas" transaction-type="RESOURCE_LOCAL"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <properties> <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/loja"/> <property name="javax.persistence.jdbc.password" value="postgres"/> <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/> <property name="javax.persistence.jdbc.user" value="postgres"/> <property name="eclipselink.ddl-generation" value="create-tables"/> <property name="eclipselink.logging.level" value="FINE"/> </properties> </persistence-unit> </persistence>

Praticando
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

Adicione as classes Cliente, Produto e Venda no mapeamento da unidade de persistncia

Gerenciamento das entidades


Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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 persistncia


Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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.

Praticando
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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

Praticando
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

Execute a aplicao (classe Principal) Acesse o seu banco de dados e observe as tabelas automaticamente criadas

Interao com EntityManager


Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

Trabalhar com transaes Incluir, alterar ou excluir um objeto Carregar um objeto do banco

Trabalhar com transaes


Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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 objeto
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

em.persist(obj) obj enfileirado no gerenciador para insero obj considerado entidade gerenciada precisa sempre estar dentro de uma transao popula o atributo chave primria
em.getTransaction().begin(); em.persist(obj); em.getTransaction().commit();

Praticando
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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 objeto
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

em.find(classe, chave primria):objeto Procura no banco de dados por um objeto da classe usando chave primria
Cliente c = em.find(Cliente.class, 1L);

Retorna null se no encontrar

Carregar um objeto
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

em.getReference(classe, chave primria):objeto Procura no banco de dados por um objeto da classe usando chave primria
Cliente c = em.getReference(Cliente.class, 1L);

Dispara exceo se no encontrar o objeto

getReference() x find()
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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 gerenciada


Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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

:Cliente
obj2

Transaes
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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

Praticando
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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 dados


Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

refresh(objeto) Recarrega o objeto com os dados do banco


em.refresh(cliente);

Mesclando entidades
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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 entidades
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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

Praticando
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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

Excluindo
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

remove(objeto) Exclui a linha relacionada ao objeto, e tira do estado de gerenciado.


em.remove(cliente);

Praticando
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

Implemente o mtodo excluir() Na janela, use o recurso [Buscar], e clique em [Excluir]

Praticando
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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 relacionamentos


Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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-um
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

Unidirecional

Bidirecional

Relacionamento unidirecional um-para-um


Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

public class Cliente { private Endereco endereco; }

Relacionamento unidirecional um-para-um


Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

public class Cliente { ... @OneToOne(cascade={CascadeType.ALL}) @JoinColumn(name=cd_endereco) private Endereco endereco; ... }

Relacionamento unidirecional um-para-um


Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

@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-um


Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

public class Cliente { ... @OneToOne(cascade={CascadeType.ALL}) @JoinColumn(name=cd_endereco) private Endereco endereco; ... }

Relacionamento um-para-um
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

Unidirecional

Bidirecional

Relacionamento bidirecional um-para-um


Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

public class Endereco { ... @OneToOne(mappedBy=endereco, cascade=CascadeType.ALL) private Cliente cliente; ... }

Relacionamento bidirecional um-para-um


Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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-um


Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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 (adilson.vahldick@udesc.br)

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 (adilson.vahldick@udesc.br)

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

Relacionamentos
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

Unidirecional Muitos-Para-Um

Unidirecional Um-Para-Muitos

Bidirecional Um-Para-Muitos ou Bidirecional Muitos-Para-Um

Relacionamento muitos-para-um
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

@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-um


Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

@Entity @Table(name=itensvenda) public class ItemVenda { ... @ManyToOne(optional=false) @JoinColumn(name="cd_produto") private Produto produto; ... }

Praticando (1)
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

Acerte os mapeamentos da classe ItemVenda Inclua o mapeamento para a classe Produto

Praticando (2)
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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-muitos
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

@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-muitos


Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

public class Venda { ... @OneToMany(cascade=CascadeType.ALL) @JoinColumn(name="cd_venda") private List<ItemVenda> itensVendas = new ArrayList<ItemVenda>(); ... }

Relacionamento unidirecional um-para-muitos


Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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-muitos


Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

Venda v = em.find(Venda.class, 1L); ItemVenda iv = v.getItensVendas().remove(0); em.remove(iv);

Praticando
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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 bidirecionais
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

public class Venda { ... @OneToMany(cascade=CascadeType.ALL, mappedBy=venda) private List<ItemVenda> itensVendas = new ArrayList<ItemVenda>(); 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 bidirecionais
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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());

Praticando
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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 QL
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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

EntityManager
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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 (adilson.vahldick@udesc.br)

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 (adilson.vahldick@udesc.br)

Query q = em.createQuery( select c from Cliente c + where c.nome like 'A%'); List<Cliente> l = em.getResultList();

Se no houver entidades, retorna lista vazia

Parmetros
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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);

Praticando
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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 aplicao
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

JPAUtil.listarTodos()
Query q = em.createQuery("select x from " + classe.getSimpleName() + " x"); return q.getResultList();

Tirar o comentrio do getValueAt() do ClientesTableModel

Paginao de resultados
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

Query q = em.createQuery(... ); q.setMaxResults(10); q.setFirstResult(31); List l = q.getResultList();

Consultas Nomeadas
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

@NamedQueries({ @NamedQuery(name=xpto, query=select...), @NamedQuery(name=..., query=...) }) public class Cliente { ... } ---Query q = em.createNamedQuery(xpto); ...

Praticando
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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 QL
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

EJB QL
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

Query q; q = em.createQuery("select v from Venda v"); List<Venda> vs = q.getResultList(); Venda v = vs.get(0); System.out.println(v.getData());

Sada: SELECT cd_venda, dt_venda FROM vendas

EJB QL
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

Query q; q = em.createQuery("select v from Venda v"); List<Venda> 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

FetchType
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

@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 FetchType
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

Classe Venda:

@OneToMany(cascade=CascadeType.ALL, mappedBy="venda" , fetch=FetchType.EAGER) private List<ItemVenda> itensVendas = new ArrayList<ItemVenda>();

Classe de Testes:
//System.out.println(v.getItensVendas().size());

Sada: SELECT cd_venda, dt_venda FROM vendas + 4 selects

EJB QL Selecionando colunas


Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

Query q; q = em.createQuery("select v.data from Venda v"); List<Date> vs = q.getResultList(); Date d = vs.get(0); System.out.println(d);

EJB QL Selecionando colunas


Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

Query q; q = em.createQuery( "select c.nome, c.credito from Cliente c"); List<Object[]> vs = q.getResultList(); Object[] colunas = vs.get(0); String nome = (String) colunas[0]; double credito = (Double) colunas[1];

EJB QL Selecionando colunas


Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

Query q; q = em.createQuery( "select c.nome, c.credito, c.endereco,"+ "c.endereco.rua from Cliente c"); List<Object[]> 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 (adilson.vahldick@udesc.br)

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 (adilson.vahldick@udesc.br)

Query q; q = em.createQuery("select "+ "new modelo.ClienteSistemaX(c.nome, "+ "c.endereco.rua, "+ "c.cartaoCredito.numeroCartao) "+ "from Cliente c"); List<ClienteSistemaX> ls = q.getResultList(); ClienteSistemaX cx = ls.get(0); System.out.println(cx.getNome() + " " + cx.getRua() + " " + cx.getNumeroCartao());

EJB QL Selecionando itens de uma coleo


Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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 Distinct
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

O nome dos produtos vendidos:

EJB-QL: select distinct iv.produto.descricao from ItemVenda iv

EJB QL Between
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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 NULL
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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 IN
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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 agregadas


Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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 Agrupamento
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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 Ordenao
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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 Subconsultas
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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, EXISTS


Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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)

Herana
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

Trs estratgias de mapeamento 1. Uma tabela para toda hierarquia de classes 2. Uma tabela por classe concreta 3. Uma tabela por subclasse

Herana
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

Uma tabela para toda a hierarquia de classes

Herana
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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 { }

Herana
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

Uma tabela por classe concreta

Herana
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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 { }

Herana
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

Uma tabela por subclasse

Herana
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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 (adilson.vahldick@udesc.br)

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 (adilson.vahldick@udesc.br)

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 (adilson.vahldick@udesc.br)

3. Uma tabela por subclasse Vantagens: Permite modelo normalizado Colunas NOT NULL Desvantagens: Desempenho inferior que SINGLE_TABLE

Relacionamento um-para-um
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

Chave estrangeira

Chave primria chave estrangeira

Um-para-um bidirecional com chave compartilhada (1)


Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

public class Endereco { ... private long id; ... }

Um-para-um bidirecional com chave compartilhada (2)


Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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 (adilson.vahldick@udesc.br)

public class Endereco { ... public long getId() { return this.cliente.getId(); } public void setId() { } ... }

Um-para-um bidirecional com chave compartilhada (4)


Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

public class Endereco { ... @OneToOne(mappedBy=endereco) @PrimaryKeyJoinColumn() public Cliente getCliente() { return cliente; } ... }

Um-para-um bidirecional com chave compartilhada (5)


Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

public class Cliente { ... @OneToOne(cascade=CascadeType.ALL, mappedBy="cliente") private Endereco endereco; public void setEndereco(Endereco endereco) { this.endereco = endereco; endereco.setCliente(this); } ... }

Praticando
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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-muitos
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

Unidirecional

Bidirecional

Relacionamento muitos-para-muitos unidirecional


Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

public class Funcionario {

@ManyToMany @JoinTable(name="atendentes", joinColumns={@JoinColumn(name="cd_funcionario")}, inverseJoinColumns={ @JoinColumn(name="cd_cliente")}) private Set<Cliente> clientes = new HashSet<Cliente>(); }

Relacionamento muitos-para-muitos unidirecional


Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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 bidirecional


Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

public class Cliente { @ManyToMany(mappedBy="clientes") private Set<Funcionario> atendentes = new HashSet<Funcionario>(); }

Relacionamento muitos-para-muitos bidirecional


Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

Funcionario f = em.find(Funcionario.class, 1L); Cliente c = f.getClientes().iterator().next(); Funcionario f2 = c.getAtendentes().iterator().next();

Praticando
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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 ordenadas


Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

public class Venda { ... @OneToMany(mappedBy="venda") @OrderBy("qtdade DESC") private List<ItemVenda> itensVenda = new ArrayList<ItemVenda>(); ... }

Chaves compostas
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

ExemploPK pk = new ExemploPK(10, "Teste"); Exemplo e = em.find(Exemplo.class, pk);

Chaves compostas
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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; }

Referncia
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)

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.

Das könnte Ihnen auch gefallen