Como trabalhar com Herança em um projeto Spring

Estou trabalhando com um simples projeto Spring Boot usando Thymeleaf, se trata de um cadastro de produtos, como tenho vários tipos de produtos para cadastrar achei interessante criar uma entidade chamada produto e as outras entidades que fosse um tipo de produto estender a entidade produto, ou seja, iria criar uma classe produto e depois criar uma classe chamado cano e ele iria estender produto, porque o cano é um tipo de produto, como vocês podem ver abaixo;

Produto

@Entity
@Table(name = “produto”)
public class Produto {

Cano

@Entity
@Table(name = “cano”)
public class Cano extends Produto implements Serializable{

Exemplo;

O produto precisa ter os atributos que qualquer produto tem que ter, como nome, descrição e valor, então iria criar uma classe chamada Cano e iria somente colocar nessa entidade atributos exclusivos dessa entidade e iria herdar os atributos da classe produto como nome, descrição e valor.

Minha Dúvida!

No ato de submeter o formulário ele cria as tabelas de forma automática, depois que salvei o Cano que é um tipo de produto achei que a aplicação iria criar uma tabela Cano, porém não foi o que aconteceu, mesmo que cano seja um tipo de produto a aplicação criou no banco de dados a tabela produto e não a tabela cano.

Se eu for estender todo tipo de produto da tabela produto vai ficar uma tabela produto extremamente gigantesca, porque eu vou ter que cadastrar no sistema materiais para banheiro, produtos de cozinha,produtos de decoração, ferramentas, materiais de construção, imagina de que tamanho vai ficar a tabela produto?

Eu queria saber que quando aplicação herança em uma aplicação esse procedimento é normal ou isso não é uma boa prática de programação?

Se não for uma boa prática de programação como faço para resolver esse problema?

Estou disponível para tira dúvidas, eu não sei se expliquei de maneira que ficou claro meu problema.

Apenas o exemplo que você colocou que não achei legal. Uma classe Cano herar de Produto parece estranho, porém, se for apropriado para o seu sistema, que seja. Pelo que entendo “cano” é um produto. Agora se você tivesse a classe Hidraulico herando de Produto, por exemplo, talvez seria mais plausível, pois há características específicas para produtos hidráulicos, que não há em produtos de limpeza, por exemplo.

Bom, tudo depende de análise, e não estou dizendo que o seu pensamento está errado. Apenas tome cuidado nessa parte, pois, com o andar do desenvolvimento, qualquer mudança no modelo de dados irá causar muita dor de cabeça.

Sobre sua dúvida, você disse que as tabelas são criadas no ato de submeter o formulário? Se for, é outra coisa estranha, ou até mesmo errada. Não crie tabelas dessa forma, o banco de dados já deve está modelado e criado quando sua aplicação for rodar, ou seja, no seu caso onde terá as tabelas Produto e Cano, essas tabelas já devem estar criadas no banco de dados e o formulário irá apenas inserir os registros.

2 curtidas

Achei essa observação bastante valida.

Eu posso está errado, mas quando você disse isso me parece não entendeu o que expliquei, é por isso que vou tentar explicar de novo;

Eu entendi que você aconselhou criar o banco antes de criar a aplicação, eu poderia fazer isso se eu estivesse usando Flyway, mas eu não sei mexer nessa ferramenta, então o FrameWorks Spring Boot nativamente ele cria as tabelas de forma automáticas, eu posso estudar futuramente o Flyway, mas preciso no momento tentar resolver esse problema que estou enfrentando agora, vou dá mais um exemplo.

Como meu projeto está criando as tabelas de forma automática se eu implementar um formulário para salvar produto Hidraulico sabendo que ele vai herdar de produto ele vai ficar assim;

codigo
produto
descricao
valor
comprimento
codigo_categoria

Se eu for implementar outro formulário, como por exemplo, cadastro de Sabonete líquido, haverá uma classe chamada SaboneteLiquido e vai herdar da classe Produto, no ato de submeter esse formulário ele vai modificar a tabela produto e vai adicionar mais atributos na tabela produto por causa da classe SaboneteLiquido, e vai ficar assim;

codigo
produto
descricao
valor
comprimento
codigo_categoria
peso_liquido

A cada implementação de cadastros diferentes realizados na aplicação ele adiciona mais atributos na tabela produtos no banco.

É isso que preciso resolver.

Eu já tentei criar o banco antes de executar minha aplicação, porém a tabela Cano fica sem nenhum registro isso porque cano é um tipo de produto.

Não sei se é necessário transforma minha classe produto em uma classe abstrata ou se tem que fazer uma outra coisa, será que deu para entender agora? :slight_smile: