Este exemplo foi construído sob demanda, a pedido de uma amiga.
A necessidade era um mapeamento de usuários no formato de amizade, onde cada usuário pode ser amigo de qualquer outro usuário.
Eu testei dois métodos apresentados nessa pergunta do Stack Overflow: https://stackoverflow.com/questions/14633798/friend-relationships-with-jpa.
Essa alternativa é mais complexa, mas parece ter atendido melhor os requisitos (ainda tem que testar inserção sem ser por SQL).
Todos os endpoints estão disponíveis no Insomnia_requests.json para serem importados no Insomnia. A saber:
- GET {{ host }}/users
- GET {{ host }}/users/1
- GET {{ host }}/users/1/friends
- GET {{ host }}/friends
O código todo está dentro do pacote firstalternative
e respeita a seguinte estrutura:
- O pacote
domain
contém as entidadesUser
(a entidade base) eFriend
(a entidade através da qual o auto-relacionamento é implementado). - O pacote
infrastructure
contém:- O pacote
repository
com os repositórios Spring Data JPA. - O pacote
projection
com uma projeção para exibir a lista de amigos de um usuário sem repetir o nome do usuário na resposta.
- O pacote
- O pacote
web
contém:- O pacote
rest
com controladores RESTUserController
eFriendController
.
- O pacote
Essa alternativa parece mais simples, mas a inserção pode ficar complicada. Nesse caso eu acabei já fazendo a inserção por código.
Todos os endpoints estão disponíveis no Insomnia_requests.json para serem importados no Insomnia. A saber:
- GET {{ host }}/people
- GET {{ host }}/people/1
- GET {{ host }}/people/1/friends
O código todo está dentro do pacote secondalternative
e respeita a seguinte estrutura:
- O pacote
bootstrap
contém um CommandLineRunner que inicializa a tabelaperson
(e consequentemente aperson_friends
) com dados. - O pacote
domain
contém a entidadePerson
. Note que nesse caso apenas uma entidade é necessária. - O pacote
infrastructure
contém:- O pacote
repository
com o repositório Spring Data JPA.
- O pacote
- O pacote
web
contém:- O pacote
rest
com controlador RESTPersonController
.
- O pacote
A pasta resources
:
- serve estaticamente o arquivo exportado do Insomnia apenas para conveniência.
- contém um arquivo
import.sql
para carregar dados na inicialização para a Alternativa 1. - serve um
index.html
dentro da pastatemplates
só pra facilitar a vida, também.
Você pode testar aqui https://jpa-self-relationship.herokuapp.com.
Se não vai importar na sua IDE favorita pra ela se virar, basta rodar:
./mvnw spring-boot:run