Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Utilizando classes generalizadas com spring

Olá turma, estou com uma dificuldade sobre classes generalizadas, por exemplo, tenho uma entidade "obra" e a mesma possui os tipos de "publica" e "privada". Focando primeiramente nas publicas, como ficaria a inserçao de dados na tabela, estou com dúvidas sobre como ficaria o repository e também as anotações Inheritance, podem me ajudar ?

Tabela obra e obra_publica: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Classe Entity obra e obra_publica: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Classe Controller obra_publica: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Classe Record (DTO chegando os dados do frontend): Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Modelo conceitual DER: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

2 respostas
solução!

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:

  1. 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.

  2. JOINED: Cada classe da hierarquia é mapeada para sua própria tabela. As tabelas são unidas usando chaves estrangeiras.

  3. 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!

Valeu Matheus, tinha pesquisado aqui também e consegui entender como realizar o JOINED, SINGLE_TABLE e TABLE_PER_CLASS. Muito Obrigado !!!