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

Hibernate não insere relação na tabela bidirecional

Tenho que persistir uma entidade que possui uma anotação ManyToOne em um de seus atributos, fiz a relação bidirecional na outra entidade filha mas sempre que persisto a entidade pai o hibernate não faz o relacionamento bidirecional no banco de dados. Podem me ajudar?

Entidade dona do relacionamento:

@Entity
public class Producao {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    private String ano;

    @ManyToOne
    private Contrato contrato;

    @Enumerated(EnumType.STRING)
    private Situacao situacao;    
}

Entidade Filha:

@Entity
public class Contrato {

    @Id
    @GeneratedValue
    private Long id;

    private boolean statusProducao;

    @ManyToOne
    private Cliente cliente;

    @ManyToOne(cascade = CascadeType.ALL)
    private Vigencia vigencia;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "contrato")
    private List<Honorario> honorarios; 

    @OneToOne
    private Produto produto;

    @Enumerated(EnumType.STRING)
    private FormaPagamento formaPagamento;

    private int prazoPagamento;

    private boolean reembolsoDespesas;

    @ManyToMany
    private List<GarantiaContrato> garantias;

    @ManyToOne
    private Consultor comercialResponsavel;

    @Column(name = "pagamento_entrega")
    private boolean pagamentoEntrega = false;

    @OneToMany(mappedBy = "contrato",fetch = FetchType.EAGER)
    private List<Producao> producao = new ArrayList<>();
2 respostas

Opa, acho que não entendi aqui. Ele grava a produção sem um contrato? O mapeamento parece correto... talvez o problema esteja no código que suas classes.

solução!

No banco de dados existe uma tabela de relacionamento com as chaves estrangeiras referente ao Id de uma produção e o id de um contrato, mas quando eu persisto a produção nada é inserido nessa relação. A solução que eu encontrei foi deixar o relacionamento unidirecional na tabela da produção através de um @RequestParam no meu controller de produção. Ficou assim:

@PostMapping("/add")
    public ModelAndView add(@Valid Producao producao, 
            @RequestParam("idContrato")Long idContrato,
            @RequestParam("idProduto") Long idProduto) {

        ModelAndView modelAndView = new ModelAndView();

        producao.setContrato(ContratoService.findById(idContrato));
        producao.setProduto(ProdutoService.findById(idProduto));
        producaoService.create(producao);
        modelAndView.setViewName("redirect:/producoes/all");

        return modelAndView;

    }

Bem estranho esse problema, mas com sorte consegui contornar. Valeu, abraços!