Hoje nossa tarefa é concluir o segundo projeto no tópico Hibernate. Sua essência é entender a estrutura do banco de dados, mapear a entidade para as tabelas existentes e adicionar a funcionalidade mínima para verificar se o mapeamento é feito corretamente.
Agora com mais detalhes:
- Baixe o arquivo de despejo e implante-o em sua máquina local. Como banco de dados, usaremos um banco de dados de teste, que é distribuído como exemplo junto com o pacote de instalação do MySQL. O dump é necessário para corrigir o estado do banco de dados, pois não podemos garantir que não mudará em um dia, mês, ano.
- Não teremos um modelo de projeto, então crie você mesmo o projeto. Deve ser um projeto maven com todas as dependências necessárias ( hibernate-core-jakarta , mysql-connector-java , p6spy ).
- Conecte nosso banco de dados implantado localmente como uma fonte de dados no Idea. Em seguida, na aba Banco de dados, coloque o cursor sobre o esquema do filme e pressione a combinação de teclas
Alt+Ctrl+Shift+U
(só funciona na versão Ultimate). Isso mostrará a estrutura de todo o esquema do filme (com nomes de colunas, chaves, etc.). Se parece com isso:Concordo, não é muito confortável de assistir. Desative a exibição do título de todas as colunas e comentários:
Como resultado, você obterá um esquema de banco de dados que já pode ser analisado:
- O circuito parece complicado, mas nem tudo é tão ruim assim. Para analisar a estrutura do banco de dados, você precisa saber por onde começar. Não existe uma única resposta correta, mas eu recomendaria começar com uma tabela
film
. Vamos pegar alguns relacionamentos como exemplo:- A relação entre tabelas
film
efilm_text
é uma relação OneToOne explícita , porque a tabelafilm_text
tem um campofilm_id
queNÃOrefere-se a um ID de uma tabelafilm
(sem chave estrangeira). Mas pelo nome e pela lógica, essa conexão deveria ser. Além disso, na tabela,film_text
o campofilm_id
funciona como uma chave primária, o que garante que um "filme" não corresponda a mais de um "texto de filme". - Agora vamos ver tabelas
film
e arquivoscategory
. Logicamente, um filme pode ter várias categorias. E uma categoria, talvez filmes diferentes. Além disso, existe uma tabela de ligação intermediária entre essas duas tabelasfilm_category
. Com base em tudo o que foi dito acima, esse é um relacionamento explícito de ManyToMany . - Nós olhamos para as tabelas
film
elanguage
. Do ponto de vista da lógica, o filme pode ter tradução para diferentes idiomas e diferentes filmes podem estar no mesmo idioma. Ou seja, ManyToMany sugere a si mesmo . Mas se olharmos para o conteúdo da tabelafilm
, podemos ver que cada linha da tabela é um filme único. E há apenas um campo language_id na linha (também há original_language_id, mas em todos os registros é nulo, então podemos ignorá-lo). Ou seja, um filme só pode ter uma linguagem. E uma língua, talvez filmes diferentes. A conexão é ManyToOne (a conexão é direcionada do filme para a linguagem).
- A relação entre tabelas
- Agora, a tarefa principal é criar todas as classes de entidade necessárias e mapeá-las nas tabelas de esquema
movie
. - Adicione um método que possa criar um novo cliente (tabela de clientes) com todos os campos dependentes. Não se esqueça de tornar o método transacional (para não cair na situação de o endereço do comprador estar registrado no banco de dados, mas o próprio comprador não).
- Adicione um método transacional que descreva o evento "o cliente foi e devolveu um filme alugado anteriormente". Escolha qualquer comprador e evento de aluguel de sua escolha. A classificação do filme não precisa ser recalculada.
- Adicione um método transacional que descreva o evento “o comprador foi à loja (loja) e alugou (aluguel) estoque (estoque) lá. Ao mesmo tempo, ele fez um pagamento (pagamento) ao vendedor (funcionários). Filme (por meio de inventário) escolha a seu critério. A única restrição é que o filme deve estar disponível para aluguel. Ou seja, não deve haver nenhum registro de estoque no aluguel, ou a coluna return_date da tabela
rental
para o último aluguel desse estoque deve ser preenchida. - Adicione um método transacional que descreva o evento "um novo filme foi filmado e ficou disponível para aluguel". Filme, idioma, atores, categorias, etc., escolha a seu critério.
- A estrutura da tabela não pode ser alterada. Mas você precisa fazer sugestões de melhoria. Identificamos um local problemático no parágrafo 4 (ausência de chave estrangeira na tabela
film_text
no campo dafilm_id
tabelafilm
). Veja se ainda existem tais “erros” na estrutura do banco de dados. Nesse caso, adicione um arquivo leia-me à raiz do projeto e descreva esses erros.
Análise do projeto: