[Exercícios] Java Persistence API - FetchType
Considerando a API de persistência JPA um dos grandes problemas a serem resolvidos é a questão da eficiência ao realizar as buscas no banco de dados. É muito comum que ao programar utilizando esta API o programador tenha q se preocupar com cada comando executado, pois estes comandos resultam em operações que podem se tornar custosas em uma aplicação que recebe muitas requisições.
O JPA possui uma opção muito utilizada que é o FechType. Essa opção controla quais entidades serão carregadas ao realizar uma operação de SELECT na base de dados. Considere o seguinte diagrama de entidade-relacionamento:
Neste caso você pode observar que existem duas entidades e uma possui uma relação OneToMany com a outra (pessoa-compra).
Pense um pouco...
Ao realizar uma busca por compras, como o resultado é expressado?
SELECT * FROM compra;
output:

Se você conhece um pouco de SQL sabe que a coluna "pessoa_idpessoa" é a coluna que realiza a conexão entre as tabelas. Os números ali inseridos são as chaves primárias da tabela "pessoa".
A partir deste ponto, toda a teoria dos InnerJoins, selects aninhados são aplicadas para gerar resultados interessantes para a aplicação e mostrar ao usuário.
O JPA possui uma opção muito utilizada que é o FechType. Essa opção controla quais entidades serão carregadas ao realizar uma operação de SELECT na base de dados. Considere o seguinte diagrama de entidade-relacionamento:
Neste caso você pode observar que existem duas entidades e uma possui uma relação OneToMany com a outra (pessoa-compra).
Pense um pouco...
Ao realizar uma busca por compras, como o resultado é expressado?
SELECT * FROM compra;
output:
Se você conhece um pouco de SQL sabe que a coluna "pessoa_idpessoa" é a coluna que realiza a conexão entre as tabelas. Os números ali inseridos são as chaves primárias da tabela "pessoa".
A partir deste ponto, toda a teoria dos InnerJoins, selects aninhados são aplicadas para gerar resultados interessantes para a aplicação e mostrar ao usuário.
Onde o JPA ajuda?
Utilizando o JPA é possível buscar todas as pessoas e dentro delas acessar uma lista de compras feitas por elas.
O problema de fazer isso é que muitas vezes não queremos que esses dados sejam carregados, assim precisamos controlar se esses relacionamentos serão mesmo carregados ao realizar um select. Para que isso seja realizado podemos utilizar o FechType.
O funcionamento do FetchType
Basicamente existem 2 tipos de "fetch": LAZY loading, EAGER loading. No LAZY loading NÃO são carregados os relacionamentos dentro da busca principal. Já no EAGER loading, tudo será carregado.
Veja como utilizar o Lazy Loading:
import javax.persistence.FetchType;
@OneToOne(fetch=FetchType.LAZY)
@JoinColumn(name="user_profile_id")
private Profile getUserProfile() {
return userProfile;
}
Para utilizar o Eager Loading basta substituir a linha para:
@OneToOne(fetch=FetchType.EAGER)
Exemplo de output
Ao realizar uma operação de busca utilizando o EAGER loading , por exemplo:
controlPessoa.findEntities()
O resultado será algo como:
Pessoa{idPessoa=1
, nome=vinicius dos santos
, login=vinicius
, email=vinistos@gmail.com
, senha=1234
, compraList=[model.Compra[ idCompra=1 ], model.Compra[ idCompra=4 ]]}
Pessoa{idPessoa=2
, nome=Mario da silva
, login=mario
, email=mario@gmail.com
, senha=1234
, compraList=[model.Compra[ idCompra=3 ]]}
Pessoa{idPessoa=3
, nome=Gabriel garcia
, login=gabriel
, email=gabriel@gmail.com
, senha=1234
, compraList=[model.Compra[ idCompra=2 ]]}
Pessoa{idPessoa=4
, nome=Isabela Ribeiro
, login=isabela
, email=isabela@gmail.com
, senha=1234
, compraList=[]}
Ao realizar a mesma busca utilizando o LAZY loading, o resultado será:
Pessoa{idPessoa=1
, nome=vinicius dos santos
, login=vinicius
, email=vinistos@gmail.com
, senha=1234
, compraList={IndirectList: not instantiated}}
Pessoa{idPessoa=2
, nome=Mario da silva
, login=mario
, email=mario@gmail.com
, senha=1234
, compraList={IndirectList: not instantiated}}
Pessoa{idPessoa=3
, nome=Gabriel garcia
, login=gabriel
, email=gabriel@gmail.com
, senha=1234
, compraList={IndirectList: not instantiated}}
Pessoa{idPessoa=4
, nome=Isabela Ribeiro
, login=isabela
, email=isabela@gmail.com
, senha=1234
, compraList={IndirectList: not instantiated}}
O resultado de indirect list not instantiated representa a lista não carregada devido ao lazy loading.
Como exercício você deverá implementar as classes definidas na Figura 1 e testar a utilização do LAZY e do EAGER loading.
Acesse a resposta aqui:
Post a Comment