Eu acho que entendi o que você quer fazer. Mas tenho uma dúvida: o seu modelo de negócio realmente precisa de herança? Se você deixar de lado o banco de dados e modelar o seu sistema com um diagrama de classes, você modelaria uma herança ou uma associação simples? Algo que pode te ajudar é fazer a seguinte pergunta: Existem múltiplas classes que podem estender ArticleModel, ou é apenas uma?
Estou fazendo a pergunta porque talvez existam outras soluções que não sejam a herança. Mas assumindo que herança é mesmo o que você precisa, então vai ter um probleminha que você vai ter que resolver com o modelo que você descreveu. Imagine que você tem a tabela TB_ARTICLE_MODEL
e várias outras tabelas a "estendendo", como o banco de dados saberia qual a tabela de extensão para cada registro na tabela TB_ARTICLE_MODEL
? A solução escolhida pelo time do JPA foi criar um atributo para fazer a distinção. Aqui fica um exemplo que eu fiz:
Note o atributo tb_article_model.proj_type
vai ser usado para saber qual a tabela de extensão.
create table tb_article_model (
article_code uuid not null,
proj_type varchar(31) not null,
article_name varchar(255),
primary key (article_code)
)
create table tb_products_in_stock (
weigth float(53),
article_code uuid not null,
primary key (article_code)
)
alter table if exists tb_products_in_stock
add constraint FKdx5614f3luj74nb5m7nf4kd5s
foreign key (article_code)
references tb_article_model
O codigo fica assim:
@Entity
@Table(name = "TB_ARTICLE_MODEL")
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="PROJ_TYPE")
public class ArticleModel {
@Id
private UUID articleCode;
private String articleName;
}
@Entity
@Table(name = "TB_PRODUCTS_IN_STOCK")
@DiscriminatorValue("PRODUCT_MODEL")
public class ProductModel extends ArticleModel {
private Double weigth;
}
@SpringBootTest
public class Heranca {
@Autowired
private ArticleRepository articleRepository;
@Test
void test() {
var p = new ProductModel();
p.setArticleCode(UUID.randomUUID());
p.setArticleName("Meu nome");
p.setWeigth(100d);
articleRepository.save(p);
}
}
O SQL de insercao ficaria assim:
Hibernate:
insert
into
tb_article_model
(article_name,proj_type,article_code)
values
(?,'PRODUCT_MODEL',?)
Hibernate:
insert
into
tb_products_in_stock
(weigth,article_code)
values
(?,?)
Espero ter ajudado.