Erro ao gravar ManyToMany no EclipseLink somente pela ponta mapeada

5 respostas
E

Olá pessoal, estou com um erro estranho aqui (consegui contornar, mas gostaria de saber porque isso ocorre e se tem alguma forma mais elegante de fazer isso). Tenho o seguinte mapeamento:

public class Person{
  (...)
  
    @ManyToMany(cascade= CascadeType.ALL, fetch= FetchType.EAGER)
    @JoinTable(
            name="client", 
            joinColumns=@JoinColumn(name="client"),
            inverseJoinColumns=@JoinColumn(name="supplier")
    )
    private Set<Person> supplier;
    @ManyToMany(cascade = CascadeType.ALL, fetch= FetchType.EAGER, mappedBy = "supplier")
    private Set<Person> client;

  (...)
}

Tenho os objetos client e supplier, por exemplo, ambos Person, e estou querendo criar um objeto.

adiciono o client ao supplier e vice versa da seguinte forma:

client.getSupplier().add(supplier);
  supplier.getClient().add(client);

Até aqui normal, nenhum erro. Gravo o client dessa forma:

if(client.getId()==null)
    getFacade().create(client);
  else
    getFacade().edit(client);

Funciona perfeitamente. O problema é se eu gravo o supplier:

if(supplier.getId()==null)
    getFacade().create(supplier);
  else
    getFacade().edit(supplier);

Que mesmo que o client já exista, ele tenta fazer um insert na base de dados, fazendo insert de todos os objetos nos relacionamentos, isso só acontece quando tento gravar um Person com um client, nunca com um Person que só tenha supplier. (obviamente, quando faço o create do supplier não faço o do client, e vice versa).

Para contornar, eu estou sempre gravando o client, mesmo quando estou criando um supplier, mando gravar o client (e o supplier é gravado pelo relacionamento), mas alguém saberia porque isso ocorre e como solucionar? Provavelmente é só um parâmetro que não estou passando na anotação.

5 Respostas

Hebert_Coelho

Como está seu mapeamento na classe supplier para a classe person?

E

é mapeamento de Person para Person. Não tem classe Supplier, quando mapeio, um Person é o supplier e o outro é o client.

E

o mapeamento é esse que está no código no primeiro post do tópico.

Hebert_Coelho

Saquei. pq seu client ta com mappedBy = “supplier”? Não acho que isso seja necessário.

Acho que o que está te matando é o cascade. tenta retirar e fazer o teste.

E

tinha tentado também sem o cascade, com Cascade.REFRESH não dava esse erro, mas também não gravava o relacionamento.

Está com o mappedBy porque é a propriedade “inversa” ao supplier, para o fornecedor, a outra pessoa é cliente, para o cliente, a outra é o fornecedor.

Criado 30 de dezembro de 2011
Ultima resposta 31 de dez. de 2011
Respostas 5
Participantes 2