cami-la / academia-digital

Projeto de LAB: Conhendo o projeto Spring data JPA com Java na prática
230 stars 241 forks source link

Usando Instant #24

Open rgiovann opened 1 year ago

rgiovann commented 1 year ago

Bom dia Camila, tudo bem? Posso dar uma sugestão? Utiliza Instant no caso de datas, a manipulação dessa classe é bem mais tranquila que a LocalDate, eu baixei o seu projeto (to fazendo o bootcamp Banco Pan da Dio) e fiz alguma alterações e usei essa classe, nos filtros de parâmetros data, pra não complicar, usei formato de data mais amigável, mas o mapeamento é tranquilo. Eu expandi um pouco os conceitos aprendidos, usei o modelmappper para fazer o mapeamento dos DTOs, criei novas queries JPQL (queria que a URL aceitasse múltiplos parâmetros de filtro e o código ligasse e desligasse os filtros de acordo).

Tive alguma dificuldade com entidades One2One principalmente em relação as queries de DTOs mais simples, pois ele insistia em fazer select das outras entidades não mapeadas no DTO (por uma questão de desempenho, não queria que ele fizesse isso), depois descobri que isso é inerente do JPA uma vez que ele não sabe se a entidade deve ou não retornar null para esses atributos, ele popula obrigatoriamente e só desliga os selects desnecessários com _optional_ = _false_. Esse artigo aqui explica bem o assunto: https://thorben-janssen.com/hibernate-tip-lazy-loading-one-to-one/

O insert de entidades com relação OneToOne também tem pegadinha sendo que vc tem que fazer "de trás para frente"´. O link desse usuário no S.O. me ajudou a entender a mecânica do processo. https://stackoverflow.com/a/75829592/11985623

Brinquei um pouco com Enums no JPA também, nesse caso o único problema que não consegui resolver é como desligar o filtro para um parâmetro que é mapeado como Enum, por exemplo, se for data e uso um filtro data_final e data_inicial é só botar como valores defaults datas com 200 anos para frente e 200 anos para trás que ele busca tudo. Mas enum não deixa acontecer, os valores tem que estar contidos dentro do domínio definido Enum. A minha solução foi meio malandropz, acabei fazendo overloading da chamada do método na camada repository e criei uma combinação de queries. Mas acredito que não seja a solução mais elegante, ainda pesquisando o assunto.

Também criei uma estrutura para lidar com os Exceptions de uma forma mais amigável para o front-end. Próximo passo seria implementar security com OAuth2/JWT e rotas habilitadas por role de usuário, mas fica para um próxima pois o bootcamp está terminando. De qualquer forma valeu o curso, vc é uma das melhores instrutoras deste Bootcamp.

Bom se vc quiser dar uma olhadinha no código, esta no meu repo no git aqui:

/rgiovann/dio-desafio-spring-jpa-academia

cami-la commented 1 year ago

Oi, @rgiovann. Tudo bem?

Existem muitas muitas muitas melhorias/evolução do projeto e várias formas de fazer "a mesma coisa". Então, tudo vai depender da arquitetura do projeto, requisições do cliente, domínio da aplicação e etc.

Esse projeto em "academia-digital" ele foi criado com o intuito de fazer um CRUD simples e apresentar algumas funcionalidades do Spring Data JPA.

Em outros projetos nós vamos explorando outras funcionalidades como Paginação, Modelagem, Cache, Segurança e etc...

Ah, e meus parabéns pelo empenho no Bootcamp e pela evolução do projeto! Ficou muito bom!!