Advertisement

[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.


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:


Nenhum comentário

Conta pra mim sua opinião!

Fale comigo