Erro ao gravar ManyToMany no EclipseLink somente pela ponta mapeada

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.

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

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

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

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.

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.