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

Erro ao salvar registros no banco de dados Oracle com Spring Data JPA

Olá, estou tentando gravar registros no banco Oracle em 2 tabelas relacionadas, porém ao tentar realizar o insert, não estou conseguindo popular o ID da tabela para para a tabela filha.

Classe Pai

@Entity
@Table(name = "tabela_pai")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TableHeader {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "tabela_pai_s")
    @SequenceGenerator(sequenceName = "tabela_pai_s", allocationSize = 1, name = "tabela_pai_s")
    private BigDecimal idTabelaPai;
    @Column(name = "ds_problema")
    private String dsProblema;
    @OneToMany(mappedBy = "tableHeader", fetch = FetchType.LAZY, cascade = CascadeType.ALL,targetEntity = TableDetail.class)    
    private List<TableDetail> detalhes = new ArrayList<>();

Tabela filha

@Entity
@Table(name = "tabela_filha")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class GourmetDetalhe {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "tabela_filha_s")
    @SequenceGenerator(sequenceName = "tabela_filha_s", allocationSize = 1, name = "XCXP_AR_PLANO_GOURMET_DETALH_S")
    private BigDecimal idTabelaFilha;
    @ManyToOne(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
    @JoinColumn(name = "id_tabela_pai")
    private TableHeader tableHeader;
    @Column(name = "ds_nome")
    private String nome;


}

Eu recebo uma lista em um json destes dados, ao tentar salvar com o comando saveAll ao inserir o primeiro registro é retornado erro porque ele não consegue recuperar o ID da tabela pai para realizar o insert.

tableRepository.saveAll(tabelHeaders);

O que posso fazer para salvar a lista corretamente?

2 respostas
solução!

Olá Marcos, tudo bem?

Pelo que entendi, você está tendo dificuldades em popular o ID da tabela pai para a tabela filha ao tentar salvar uma lista de registros no banco de dados Oracle com Spring Data JPA.

Uma possível solução é salvar as tabelas separadamente, primeiro a tabela pai e depois a tabela filha, usando o método save() ao invés do saveAll(). Dessa forma, o ID da tabela pai já estará disponível para ser utilizado na tabela filha.

Por exemplo:

// Salva a tabela pai
TableHeader savedHeader = tableHeaderRepository.save(tableHeader);

// Popula o ID da tabela pai na tabela filha
tableDetail.setTableHeader(savedHeader);

// Salva a tabela filha
tableDetailRepository.save(tableDetail);

Espero ter ajudado e bons estudos!

obrigado!