Olá Rodrigo, tudo bem?
Primeiramente, vamos falar sobre a anotação @Inheritance. Ela é usada para definir a estratégia de herança que o JPA deve usar. Existem três tipos de estratégias:
SINGLE_TABLE: Essa é a estratégia padrão. Todas as classes da hierarquia são mapeadas para uma única tabela no banco de dados. A tabela tem uma coluna discriminante para identificar a classe concreta de cada linha.
JOINED: Cada classe da hierarquia é mapeada para sua própria tabela. As tabelas são unidas usando chaves estrangeiras.
TABLE_PER_CLASS: Cada classe é mapeada para sua própria tabela. As tabelas não são relacionadas por chaves estrangeiras.
No seu caso, parece que você está tentando usar a estratégia JOINED, onde a entidade "Obra" é uma superclasse e "ObraPublica" é uma subclasse.
Aqui está um exemplo de como você pode configurar suas classes:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Obra {
@Id
private Long id;
// outros campos
}
@Entity
public class ObraPublica extends Obra {
// campos específicos de ObraPublica
}
Para o repositório, você pode ter um para cada entidade, assim:
public interface ObraRepository extends JpaRepository<Obra, Long> {}
public interface ObraPublicaRepository extends JpaRepository<ObraPublica, Long> {}
E no seu controlador, você pode injetar o repositório e usar os métodos save, find, etc:
@RestController
@RequestMapping("/obraspublicas")
public class ObraPublicaController {
@Autowired
private ObraPublicaRepository obraPublicaRepository;
@PostMapping
public ObraPublica create(@RequestBody ObraPublica obraPublica) {
return obraPublicaRepository.save(obraPublica);
}
// outros métodos
}
Espero que isso esclareça suas dúvidas. Se ainda tiver alguma confusão, por favor, deixe-me saber. Lembre-se que esta é apenas uma sugestão e pode não ser a solução perfeita para o seu caso específico.
Espero ter ajudado e bons estudos!