Estou fazendo um projeto utilizando JavaFX, JPA/Hibernate e MySQL, e estou seguindo alguns padrões que aprendi como padrão MVC para o Backend, e a 2FN no banco de dados. Mas agora estou com uma dúvida em questão de tabelas que vão ser mapeadas pelas entidades no backend.
Por exemplo: eu tenho uma tabela Funcionário com suas dúvidas colunas, e também tenho uma tabela Endereço, onde tem uma relação 1-n com a tabela Funcionário, até aí tudo bem. Mas seguindo a 2FN, criei as tabelas Bairro, Cidade, Estado e Pais, cada uma tendo uma relação n-1. E também vou ter a tabela Contato, onde vai ter uma relação 1-n com a tabela Funcionário.
A minha pergunta é, como eu vou mapear essas tabelas no meu backend ??? Onde eu vou colocar todas essas entidades ???
São muitas entidades para ser mapeadas, se eu estiver seguindo corretamente, mas como eu poderia usar com um exemplo de Formulário de Funcionário:
Vou pegar todos os dados de funcionário, aí vem a parte de colocar o endereço. Eu teria que usar cada entidade de endereço só para armazenar nome do bairro, nome da cidade, nome do estado, … ???
(Fora que ainda tem mais entidades importantes no meu projeto)
Por favor alguém me ajuda porque eu estou muito confuso kkkkkk
Se o bairro, cidade e estado são entidades, então sim, o Endereco terá uma referência a cada um deles.
Claro, assumindo que vc criou as tabelas com as devidas chaves estrangeiras (foreign keys). Por exemplo, na tabela endereço vc tem colunas com os IDs do bairro, cidade e estado, que se referem às chaves de cada tabela. E na entidade vc mapeia as respectivas entidades com @JoinColumn e @ManyToOne.
Era essa também a minha dúvida. Mas a minha maior dúvida é sobre onde eu vou colocar cada entidade (exemplo de Endereço, que são múltiplas tabelas, e Contato) ? E também se é necessário mesmo criar essas entidades para serem mapeadas ?
Se existe a respectiva tabela no banco, então deveria mapear sim. Senão vc não aproveita a grande vantagem do Hibernate, que é justamente de fazer o mapeamento automático, usar queries JPQL, etc.
O que vc pode questionar é se precisa existir determinada tabela. Cidade e estado, por exemplo, costumam ter tabelas próprias. Mas para o estado também é comum usar enum, já que é um conjunto fixo de valores e raramente muda. Aí no banco é uma coluna VARCHAR mesmo, bastando apenas fazer o mapeamento correto. Para o bairro já é mais discutível, pois há muita variação e geralmente deixa-se um campo de texto mesmo (ou seja, na classe seria uma String e na tabela, uma coluna VARCHAR).
Não, até porque, sinceramente, isso é bem pouco. E caso tenha muitas mesmo (dezenas ou centenas), quem disse que precisa ficar tudo na mesma pasta? O que impede de, por exemplo, criar sub-pastas? Não existe uma regra universal, teoricamente vc pode colocar qualquer classe em qualquer pacote. O que acontece é que, na prática, para fins de organização, costuma-se agrupar coisas parecidas ou relacionadas na mesma pasta, e usar sub-pastas para segmentar melhor a organização.
Poxa cara, você abriu a minha cabeça agora kkkkk. Eu tava bem preocupado com essa questão de ter muitas entidades em um projeto, nunca fiz um projeto tão grande como esse.
Então eu poderia colocar as entidades de endereço e contato dentro de um pacote infra ?
Como eu não sei os detalhes do seu projeto, o máximo que dá pra dizer é que vc pode organizar da forma que achar melhor.
Só não sei se “infra” é um bom nome. Talvez “location” ou “address” para as entidades relativas ao endereço, e “contact” para as formas de contato, por exemplo, seja melhor. Mas aí vai da sua análise, tem trocentas formas de fazer e não há uma resposta certa.