• Nenhum resultado encontrado

Para acessar os dados da Conta de uma Movimentação, utilizamos a anotação

N/A
N/A
Protected

Academic year: 2022

Share " Para acessar os dados da Conta de uma Movimentação, utilizamos a anotação "

Copied!
45
0
0

Texto

(1)

Java Enterprise Edition - JEE

05. Relacionamento bidirecional e Lazyness

Esp. Márcio Palheta

(2)

Relacionamento bidirecional

Para acessar os dados da Conta de uma Movimentação, utilizamos a anotação

@ManyToOne;

@ManyToOne;

Agora, nosso objetivo é acessar as

Movimentações a partir de uma Conta;

Para isso, precisaremos criar um

atributo em Conta para guardar a

(3)

Exercício 01

Inclua uma coleção para guardar as

Movimentações da Conta:

(4)

Itens a ponderar

A inclusão do novo mapeamento não deveria mudar nada na estrutura das tabelas;

tabelas;

A tabela movimentacao já tem a chave estrangeira para a tabela de contas;

Para verificar se está tudo correto, rode

novamente a classe TestePersistencia;

(5)

Surgimento de nova tabela

Após a execução da classe de teste,

acesse o banco de dados para verificar se há algo diferente;

se há algo diferente;

Foi criada a tabela Conta_Movimentacao

A nova tabela possui os campos:

Int conta_id;

Int movimentacoes_id;

(6)

Relacional vs Objetos

No banco de dados, a chave estrangeira já representa:

A relação muitos-para-um da movimentação

A relação muitos-para-um da movimentação para a conta; e

A relação um-para-muitos da conta para as movimentações;

Mas no mundo OO, essa relação não é

(7)

Mapeamento bidirecional

Não é porque temos um atributo Conta na classe Movimentação, que teremos, automaticamente um atributo

automaticamente um atributo

List<Movimentacao> na classe Conta;

Tivemos que fazer isso manualmente;

O inverso também não é obrigatório;

(8)

Mapeamento bidirecional

Para a JPA, existem duas relações distintas;

Por isso o Hibernate criou a tabela

Conta_Movimentacao para representar o Conta_Movimentacao para representar o mapemento um-para-muitos;

Precisamos que o Hibernate entenda que OneToMany representa o mesmo

relacionamento mapeado em ManyToOne

(9)

Mapeamento Bidirecional

A anotação OneToMany tem um atributo mappedBy;

mappedBy indica que a relação é a

mappedBy indica que a relação é a mesma representada pelo atributo conta da classe Movimentacao;

A seguir, vamos atualizar a anotação

@OneToMany da classe Conta

(10)

Exercício 02

Atualize a classe Conta e exclua a

tabela Conta_Movimentacao do BD:

(11)

Exercício 03

Crie a classe TesteBiderecional;

No método main(), crie objetos ContaDAO e MovimentacaoDAO;

ContaDAO e MovimentacaoDAO;

Pesquise uma conta e imprima sua movimentações;

Pesquise uma movimentação e imprima

os dados de sua conta;

(12)

Itens a ponderar

A classe sem mappedBy determina o modelo de banco de dados;

Essa classe é chamada de owning entity

Essa classe é chamada de owning entity ou lado forte da relação;

A classe com mappedBy é conhecida

como inverse entity ou lado fraco da

relação;

(13)

Mapeamento ManyToMany

Nossos usuários viram a necessidade de classificar melhor as movimentações,

alem de ENTRADA ou SAIDA;

alem de ENTRADA ou SAIDA;

Vamos permitir que o usuário associe TAGs às suas movimentações;

A seguir, verificaremos as mudanças

necessárias ao modelo;

(14)

Atualização do modelo

(15)

Exercício 04

(16)

Atualização da Movimentação

Na classe Movimentacao, incluiremos um atributo List<Tag> tags para

guardar a coleção de Tags;

guardar a coleção de Tags;

O novo atributo será marcado com

@ManyToMany;

O Hibernate criará uma tabela de

relacionamento para representar N x N

(17)

Exercício 05

(18)

Criando a classe TagDAO

Vamos criar uma classe TagDAO para persistir as tags da nossa aplicação;

Criaremos um método para cadastrar

Criaremos um método para cadastrar ou consultar uma tag, com base no nome;

O método main() testa a persistência;

Qual o resultado da execução?

(19)

Exercício 06 - TagDAO

(20)

Exercício 07 - TesteTagDAO

(21)

NoResultException

Exceção lançada quando não há

resultado para query.getSingleResult();

(22)

Exercício 08 – Try ... Catch

(23)

Exercício 09

(24)

Exercício 09 – continuação

(25)

Exercício 10

(26)

Estados de entidades

Managed(gerenciado) – o Hibernate garante que o objeto terá

representação idêntica ao do banco;

representação idêntica ao do banco;

Transient – objetos que não possuem representação no banco(new);

Usamos em.persist() para passar de

Transient para Managed;

(27)

Estados de entidades

Detached – um objeto é managed enquanto o entityManager estiver aberto.

aberto.

Com em.close(), o objeto passa de managed para detached;

Removed – logo após executar

em.remove(), o objeto deixa de existir

no banco, mas continua em

(28)

LazyInitializationException

Listar Movimentações e Tags

EntityManager e Transação gerenciados pela camada de controle;

pela camada de controle;

A tela imprime a movimentação, mas quando tenta imprimir as Tags...

Ocorre exceção porque o EM já está

fechado;

(29)

Decisões sobre as consultas

Lazy load – carregamento lento. A

carga da coleção não ocorre junto com a carga do objeto que a contem;

Eager – a coleção é carregada junto

Eager – a coleção é carregada junto

com o objeto que a contem;

(30)

Hibernate e pool de conexões

Acesso simultâneo de muitos usuários;

Criar conexão é um processo custoso;

Podemos gerenciar as conexões

Podemos gerenciar as conexões gerando um Pool de Conexões;

O Hibernate tem um pool embutido

c3p0

(31)

Exercício 11

Copie e adicione as libs do c3p0 ao classpath da aplicação.

Atualize o persistence.xml

Atualize o persistence.xml

(32)

Outros mapeamentos

Em nosso modelo, toda Conta deve possuir um Gerente;

E o Gerente só pode ser responsável

E o Gerente só pode ser responsável por uma Conta;

Anotação @OneToOne

A seguir, mostramos a criamos a nova

classe Gerente:

(33)

Exercício 12

(34)

Exercício 13

(35)

O pattern Value Object

Objetos que servem para representar

um ou mais valores relativos ao domínio

Objetos que não precisam ser

Objetos que não precisam ser identificáveis

Em nosso modelo, poderíamos

reaproveitar a estrutura de Endereço do

Gerente, para outras classes;

(36)

Value Object e Embeddable

O gerente tem endereço com: rua, cidade e estado;

Outras entidades podem precisar dessa

Outras entidades podem precisar dessa informação;

Vamos isolar o código de endereço em uma nova classe;

NÃO vamos gerar uma nova tabela

(37)

A classe Endereco

A classe endereço terá os atributos:

rua, cidade e estado;

Mas essa nova classe não deve ser uma

Mas essa nova classe não deve ser uma entidade;

Um objeto Endereço pode ser embutido

em outros objetos

(38)

Exercício 14

Classe Endereco marcada com

@Embeddable

(39)

Exercício 15

Atualização da classe Gerente

(40)

Exercício 16

Criar uma classe de teste

Cadastrar gerentes;

Associar gerentes a contas;

Associar gerentes a contas;

Listar conta / gerente;

Consultar conta por gerente;

(41)

Chaves compostas

A representação de chaves compostas no Hibernate se dá pela criação de uma nova classe, para representar a chave

nova classe, para representar a chave de uma entidade;

A nova classe devem implementar a interface Serializable;

Classe anotada com @Embeddable

(42)

Representacao - ID do cliente

(43)

Classe entidade Cliente

(44)

Referências

www.caelum.com.br

http://hibernate.org/docs

Hall, Marty, “Core Servlets and Java Server

Hall, Marty, “Core Servlets and Java Server Pages”, Janeiro 2002, Sun Microsystems

Press;

http://java.sun.com/j2ee/1.6/docs/tutorial/d

oc/index.html

(45)

Java Enterprise Edition - JEE

05. Relacionamento bidirecional e Lazyness

Esp. Márcio Palheta

Referências

Documentos relacionados

Com o estudo anterior (AMARAL, 2009) sobre a evolução da infografia no meio, surgiram dúvidas a respeito de alguns exemplos pesquisados. Percebemos que a fronteira

Uma maneira viável para compreender uma reação química é através da conservação das massas, isso porque numa abordagem mais ampla, como demonstra no livro

Ainda na última parte da narrativa, outro “milagre” acontece: Grenouille apa- rece, de súbito, em meio ao povo, destampa uma pequena garrafa que trazia consi- go, borrifa-se com

ado a necessidade de modificar o pré- se manter o dorso do frango à 95C por 30 minutos, este procedimento desnaturava o colágeno, formando um gel scrito

Diante disto o objetivo deste trabalho foi avaliar a extração de antocianinas a partir do repolho roxo (Brassica oleracea), em diferentes condições de pH, temperatura e

GUIÃO DE EDUCAÇÃO GÉNERO E CIDADANIA 1º ciclo... Ficha

O termo extrusão do núcleo pulposo aguda e não compressiva (Enpanc) é usado aqui, pois descreve as principais características da doença e ajuda a

Com intuito, de oferecer os gestores informações precisas atualizadas e pré-formatas sobre os custos que auxiliem nas tomadas de decisões corretas, nos diversos