[RESOLVIDO] Hibernate deleção em @ManyToMany

1 resposta
turim

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.

1 Resposta

turim

Bom, para quem se deparar comomesmo problema não é necessário mapeamento bi-direcional. O problema estava nas duas classes possui CascadeType.ALL, no caso de relacionamento bi-direcional.

Notei que ao deletar um objeto da lista, o hibernate execute o delete, e faz novamente os inserts dos objetos, quando em transações diferentes, não sei se é normal, mas fucnionou, pelo menos obando fica igual os objetos da memória.

[DEBUG] Hibernate: delete from CLIENTE_TIPO_COBRANCA where ID_CLIENTE=?
[DEBUG] Hibernate: insert into CLIENTE_TIPO_COBRANCA (ID_CLIENTE, ID_TIPO_COBRANCA) values (?, ?)
[DEBUG] Hibernate: insert into CLIENTE_TIPO_COBRANCA (ID_CLIENTE, ID_TIPO_COBRANCA) values (?, ?)

Ah, equals/hash, code eu tirei e também funcionou.

Criado 2 de julho de 2012
Ultima resposta 2 de jul. de 2012
Respostas 1
Participantes 1