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.