JPA - Adicionar um campo a mais no Composite Id

Olá, pessoal.

O negócio é o seguinte. No meu banco de dados tenho a tabela ‘PEDIDO’ que se relaciona com a tabela ‘SERVICOS_HAS_PEDIDO’ que relaciona com a tabela ‘SERVICOS’. O que importa aqui é que a tabela ‘SERVICOS_HAS_PEDIDO’ possui uma chave composta por dois campos inteiros: ‘servicos_codServico’ e ‘pedido_codPedido’. Montei minha entidades tranquilamente usando @EmbeddeId como resumidamente mostro abaixo:

ServicosHasPedido

public class ServicosHasPedido implements Serializable {
    
    @EmbeddedId
    protected ServicosHasPedidoPK servicosHasPedidoPK;

    // etc...

}

ServicosHasPedidoPK

@Embeddable
public class ServicosHasPedidoPK implements Serializable {
    
    @Basic(optional = false)
    @Column(name = "SERVICOS_CODSERVICO")
    private int servicosCodservico;
    @Basic(optional = false)
    @Column(name = "PEDIDO_CODPEDIDO")
    private int pedidoCodpedido;

}

E está assim modelado e funciona como uma beleza. O meu problema é que foi modelado errado e agora eu preciso adicionar mais um campo em ServicosHasPedidoPK, um código para permitir que um pedido possa ter o mesmo serviço mais de uma vez. Então eu fiz o seguinte:

ServicosHasPedidoPK (atualização)

@Embeddable
public class ServicosHasPedidoPK implements Serializable {
    
    @Basic(optional = false)
    @Column(name = "CODSERVICOSHASPEDIDO", nullable=false)
    private int codservicoshaspedido;
    @Basic(optional = false)
    @Column(name = "SERVICOS_CODSERVICO")
    private int servicosCodservico;
    @Basic(optional = false)
    @Column(name = "PEDIDO_CODPEDIDO")
    private int pedidoCodpedido;

}

Ao rodar a aplicação novamente verifiquei que ele cria o novo campo só que não adiciona na constraint que forma a primary key no banco de dados, sendo que ao tentar cadastrar um mesmo serviço no pedido ele dá erro de violação de constraint da chave primária.

Gostaria de saber se é possível adicionar este meu novo campo de ServicosHasPedidoPK na chave primária composta criada utilizando os annotations do JPA? Se sim, como fazer isso? Ressaltando que eu não posso deletar a tabela porque ela já conta com dados cadastrados. Uma sinuca de bico. Alguém tem alguma sugestão?

Desde já agradeço.

Tentou apagar só a constraint? Talvez o JPA perceba que ela não exista e crie com a nova definição.

Cheguei a fazer isso sim e funciona. Para quem tiver o problema sem ter colocado em produção fica a dica.

Porém não é uma solução nada prática, até porque você tem que pegar o nome das constraint que são criadas pelo Hibernate, e para cada banco criado ele cria nomes diferentes para as constraints e fk’s. Eu imaginava que o próprio JPA remodelasse isso. Quer dizer, ele o faz, mas como o banco em questão já tinha dados acredito que fica impedido de fazer drops e recriar as constraints.

Não sei, no momento a única saída que eu consigo pensar seria criar outra entidade modelada dessa forma que eu quero e arranjar um jeito de transferir os dados de uma tabela para a outra. Sendo que isso vai dar um trabalhão…

A não ser que alguém conheça uma annotation mágica que resolva o problema tudo automaticamente. :slight_smile: