Olá galera,
Estou com problemas na deleção de registros em uma tabela/entidade com relacionamento @ManyToMany.
Pelo o que pude ver ele deve ser bidirecional obrigatoriamente, com List do dois lados.
Tenho duas entidades
Cliente.java
@Entity
@Table(name = "CLIENTE")
public class Cliente implements java.io.Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID_CLIENTE")
private Integer id;
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "CLIENTE_TIPO_COBRANCA", joinColumns = @JoinColumn(name = "ID_CLIENTE"), inverseJoinColumns = @JoinColumn(name = "ID_TIPO_COBRANCA"))
private List<TipoCobranca> tipoCobrancas;
(...)
}
TipoCobranca.java
@Entity
@Table(name = "TIPO_COBRANCA")
public class TipoCobranca implements java.io.Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID_TIPO_COBRANCA")
private Integer id;
@ManyToMany(mappedBy = "tipoCobrancas", cascade = CascadeType.ALL)
private List<Cliente> clientes;
(...)
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
TipoCobranca other = (TipoCobranca) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
Acredito que o mapeamente esteja correto. De acordo com este artigo o método Equals e hashCode deve ser subscrito para usar em Listas. Mas quando tenta remover um item na lista, elel não deleta da tabela associativa e sim da tabela TIPO_COBRANCA.
cliente.getTipoCobrancas().remove(0);
DEBUG: Hibernate: delete from TIPO_COBRANCA where ID_TIPO_COBRANCA=?
Alguém sabe o por quê disso ?
Valeu.