Beruflich Dokumente
Kultur Dokumente
br)
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
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)
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]
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
@Table(name=)
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)
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
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
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)
Cliente c = new Cliente(); c.setNome(Adilson); c.setCredito(100); ..... EntityManager em = ..... em.persist(c); c.setNome(Adilson Vahldick); ....
No-Gerenciado No-Gerenciado
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
Trabalhar com transaes Incluir, alterar ou excluir um objeto Carregar um objeto do banco
em.getTransaction().begin(); ... obj = new Xpto(); obj.setAbc(123); persistir objeto (obj) .... em.getTransaction().commit();
...
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);
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);
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
obj2 == obj
obj1
:Cliente
obj2
Transaes
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)
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
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)
Praticando
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)
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
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
public class Cliente { ... @OneToOne(cascade={CascadeType.ALL}) @JoinColumn(name=cd_endereco) private Endereco endereco; ... }
@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()
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
public class Endereco { ... @OneToOne(mappedBy=endereco, cascade=CascadeType.ALL) private Cliente cliente; ... }
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); }
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
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.
@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)
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
public class Venda { ... @OneToMany(cascade=CascadeType.ALL) @JoinColumn(name="cd_venda") private List<ItemVenda> itensVendas = new ArrayList<ItemVenda>(); ... }
Venda v = new Venda(); ItemVenda iv = new ItemVenda(); iv.setPcoUnit(1); iv.setQtdade(10); v.getItensVendas().add(iv); em.persist(v);
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();
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();
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();
Paginao de resultados
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)
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
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());
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());
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:
Classe de Testes:
//System.out.println(v.getItensVendas().size());
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);
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];
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];
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 ... }
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());
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)
EJB QL Between
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)
EJB QL IS NULL
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)
EJB QL IN
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)
EJB-QL: select c from Cliente c where c.endereco.estado not in('PR', 'SC', 'RS')
EJB QL Agrupamento
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)
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)
EJB QL Subconsultas
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)
EJB-QL: select iv.produto.descricao from ItemVenda iv where iv.pcoUnit > (select avg(i.pcoUnit) from ItemVenda i)
EJB-QL: select v from Venda v where (select sum(iv.pcoUnit) from v.itensVenda iv) > 12
EJB-QL: select v from Venda v where 3 < all (select iv.qtdade from v.itensVenda iv)
EJB-QL: select v from Venda v where 10 < any(select iv.qtdade from v.itensVenda iv)
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)
Herana
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)
@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)
Herana
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)
@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)
Herana
Prof. Adilson Vahldick (adilson.vahldick@udesc.br)
@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 { }
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
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
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
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() { ... } ... }
public class Endereco { ... public long getId() { return this.cliente.getId(); } public void setId() { } ... }
public class Endereco { ... @OneToOne(mappedBy=endereco) @PrimaryKeyJoinColumn() public Cliente getCliente() { return cliente; } ... }
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
@ManyToMany @JoinTable(name="atendentes", joinColumns={@JoinColumn(name="cd_funcionario")}, inverseJoinColumns={ @JoinColumn(name="cd_cliente")}) private Set<Cliente> clientes = new HashSet<Cliente>(); }
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();
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
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)
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.