Problemas de mapeamento ManyToMany com hibernate [resolvido]

5 respostas
jpajavahibernate
J

Boa tarde, estou com um problema de mapeamento com ManyToMany, considerem o seguinte exemplo:

public class A {
        @ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST})
        @JoinTable(name = "C", joinColumns = {@JoinColumn(name = "id_a")}, 
        inverseJoinColumns = {@JoinColumn(name = "id_b")})
        private List<B> b = new ArrayList<B>();
}

public class B{
    @ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST})
    private List<A> a = new ArrayList<A>;
}

se eu faço esse mapeamento a minha aplicação sobre sem problemas, porém se eu tento rodar uma jpql fazendo o join o hibernate estoura uma exception informando que não achou no banco a tabela a_b, sendo que especifiquei no @JoinTable que o nome da tabela de relação é “c”, como posso resolver o problema, preciso renomear a tabele e os campos porque na aplicação o nome que o hibernate quer gerar é muito grande e realmente preciso modificar a tabela e as FKs PKs.
Obrigado.

5 Respostas

darlan_machado

Mostra o jpql.

J

Select i.idComponente,
i.apelido,
m.nome,
v.placa,
v.descricao,
r.portatil,
v.codVeiculo
from RFIDMotorista rm
inner join rm.identificacaoRadioFrequencia i
on rm.dataTermino is null
inner join i.veiculos v
inner join rm.motorista m
on rm.dataTermino is null
inner join v.rastreador r
where v.id = :idVeiculo
order by i.apelido,
i.idComponente

nesse caso é o Veiculo que está com a @JoinTable e o IdentificacaoRadioFrequencia é o outro lado do manytomany

@ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST})
@JoinTable(name = "identificacao_radiofrequencia_veiculo", joinColumns = {@JoinColumn(name = "id_veiculo")}, inverseJoinColumns = {@JoinColumn(name = "id_rfid")})
private List<IdentificacaoRadioFrequencia> identificacoesRadioFrequencia = new ArrayList<IdentificacaoRadioFrequencia>();


@ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST})
public List<Veiculo> veiculos = new ArrayList<Veiculo>();
darlan_machado

Faltou informar o @JoinTable no mapeamento do atributo veículos.

J

vou verificar aqui, achava que só precisava fazer o @JoinTable somente em um dos lados

J

Era isso mesmo, como o relacionamento é bidirecional preciso jogar dos 2 lados a anotação, obrigado.

Criado 2 de março de 2018
Ultima resposta 2 de mar. de 2018
Respostas 5
Participantes 2