- Índice
- Sobre
- Configuração Inicial
- Configurando os Relacionamentos
- Estratégia de Carregamento
- Operações CRUD
- Notas Técnicas Adicionais
- Tecnologias Utilizadas
- Como Contribuir
- Créditos
- Contato
Este projeto é uma aplicação que busca fornecer um sistema de relatório de vendas baseado em uma arquitetura de microserviços utilizando Spring Boot. Esta aplicação é composta por Entidades, DTOs (Data Transfer Objects), Repositories, Services e Controllers.
No sistema há duas entidades principais, Sale
e Seller
, que têm uma relação de muitos-para-um (ManyToOne) e um-para-muitos (OneToMany).
Para entender a estrutura básica do projeto, consulte o diagrama de classes abaixo. O diagrama de classes fornece uma representação visual das classes envolvidas e suas interações, facilitando a compreensão do design do projeto.
Detalhando como essas relações são estabelecidas na prática:
- Classe
Sale
: - Relação "Muitos para Um" (Sale -> Seller)
@Entity
@Table(name = "tb_sales")
public class Sale {
// ...
@ManyToOne
@JoinColumn(name = "seller_id")
private Seller seller;
// ...
}
A entidade Sale
possui uma relação ManyToOne com a entidade Seller
, indicando que muitas vendas podem ser realizadas por um vendedor. A anotação @JoinColumn
é usada para indicar a coluna que é usada como chave estrangeira.
- Classe
Seller
: - Relação "Um para Muitos" (Seller -> Sale)
@Entity
@Table(name = "tb_seller")
public class Seller {
// ...
@OneToMany(mappedBy = "seller")
private List<Sale> sales = new ArrayList<>();
// ...
}
A entidade Seller
possui uma relação OneToMany com a entidade Sale
, indicando que um vendedor pode realizar muitas vendas. A anotação mappedBy
é usada para indicar o campo na entidade de venda que está mapeando o relacionamento.
No JPA, ao lidar com relações entre entidades, podemos escolher entre duas estratégias de carregamento: Eager (Ávido) e Lazy (Preguiçoso).
Por padrão, as relações @ManyToOne
e @OneToOne
são carregadas de forma Eager, o que significa que elas são carregadas automaticamente quando a entidade pai é carregada. Por outro lado, as relações @OneToMany
e @ManyToMany
são carregadas de forma Lazy, o que significa que elas só são carregadas quando são explicitamente acessadas.
Por exemplo, quando carregamos um objeto Sale
, o JPA também carrega automaticamente o objeto Seller
relacionado devido à estratégia Eager. No entanto, quando carregamos um objeto Seller
, o JPA não carrega a lista de objetos Sale
relacionados até que nós explicitamente acessamos essa lista.
O problema da consulta N+1 é um problema comum que pode ocorrer em aplicações que utilizam ORMs como o JPA. Esse problema ocorre quando o framework executa uma consulta adicional para cada entidade que é recuperada em uma consulta.
Por exemplo, ao carregar uma lista de Sales
, o JPA executa uma consulta para buscar todas as Sales
. Para cada Sale
recuperada, o JPA executa uma consulta adicional para buscar o Seller
associado devido ao carregamento Eager. Portanto, para N Sales
, o JPA executa N+1 consultas no total.
Para evitar o problema da consulta N+1, podemos utilizar a anotação @Transactional(readOnly = true)
nos nossos métodos de serviço, garantindo que todas as consultas necessárias sejam feitas na mesma transação.
Além disso, podemos utilizar a cláusula JOIN FETCH
em nossas consultas JPQL para indicar ao JPA para carregar as entidades relacionadas em uma única consulta, em vez de várias consultas.
No entanto, é importante notar que o uso de JOIN FETCH
pode resultar na recuperação de muitos dados, potencialmente sobrecarregando a memória. Portanto, é importante usar JOIN FETCH
com cuidado e apenas quando necessário.
Em resumo, é importante entender as estratégias de carregamento e como elas podem afetar o desempenho da aplicação. A estratégia correta a ser usada depende das necessidades específicas da aplicação e do modelo de dados proposto.
Este projeto fornece operações CRUD básicas como findById
, getReport
e getSummary
.
...
Antes de iniciar, assegure-se de ter o ambiente Java corretamente configurado em sua máquina. Abaixo você tem a relação das tecnologias que foram utilizadas no processo de desenvolvimento do projeto.
Tecnologia | Versão | Logo / Link |
---|---|---|
Sistema Operacional | Windows 11 | |
Linguagem de Programação (JDK) | Java 17 LTS (Azul Zulu) | |
Framework | Spring Boot 3.1.0 | |
Banco de Dados | H2 Database | |
IDE | IntelliJ IDEA 2023.1.2 (Community Edition) | |
Ferramenta de Teste de API | Postman v10.14.9 |
Contribuições são sempre bem-vindas! Se você tem uma sugestão que poderia melhorar este projeto, por favor, abra uma issue ou um pull request, seguindo os passos abaixo.
- Crie um 'Fork' do projeto
- Crie uma 'Branch' para sua modificação (
git checkout -b feature/AmazingFeature
) - Faça o 'Commit' das suas mudanças (
git commit -m 'Add some AmazingFeature'
) - 'Push' para a 'Branch' (
git push origin feature/AmazingFeature
) - Abra uma 'Pull Request'
...
Se você tiver alguma dúvida, comentário ou sugestão, fique à vontade para abrir uma issue
aqui no GitHub ou me contate diretamente através do e-mail: solucao.erp@gmail.com