[Hibernate] many-to-many delete

Olá amigos.

Tenho duas tabelas mantendo um relacionamento N:N no meu banco de dados, são elas: CARROS e OPCIONAIS.
A tabela que auxilia o relacionamento eu chamo de CARROS_OPCIONAIS.

CARROS:

CREATE TABLE carros
(
  id int4 NOT NULL DEFAULT nextval('seq_carro'::regclass),
  nome varchar(50),
  CONSTRAINT carros_pkey PRIMARY KEY (id)
) 

OPCIONAIS

CREATE TABLE opcional
(
  id int4 NOT NULL DEFAULT nextval('seq_opcional'::regclass),
  nome varchar(50),
  CONSTRAINT opcional_pkey PRIMARY KEY (id)
) 

A tabela que faz a associação entre as duas é:
CARROS_OPCIONAIS

CREATE TABLE carros_opcionais
(
  idcarro int4,
  idopcional int4,
  CONSTRAINT carros_opcionais_idcarro_fkey FOREIGN KEY (idcarro)
      REFERENCES carros (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT carros_opcionais_idopcional_fkey FOREIGN KEY (idopcional)
      REFERENCES opcionais (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
) 

Tudo mapeado certinho com o Hibernate 3.2.
Gostaria de saber qual a melhor forma de apagar um objeto da classe Carro, sem contudo, apagar os objetos da classe Opcional? Uma vez que, se eu configurar o mapeamento como cascade=“all” ou coisa parecida, quando eu apago o Carro ele deleta os Opcionais do banco de dados também.

Obrigado

Deve ser problema no seu mapeamento.

Vcs está usando annotation ou os HBM.xml ?

to usando XMLs…

<hibernate-mapping>

	<class name="main.Carro" table="carro">
		
		<id name="id" unsaved-value="-1">
			<generator class="increment"/>
		</id>
		
		<property name="nome" type="java.lang.String" column="nome"/>
		<set name="opcionais" inverse="true" table="carro_opcional" cascade="save-update">

			<key column="idcarro"/>
			<many-to-many class="main.Opcional" column="idopcional"/>
		</set>
		
	</class>
</hibernate-mapping>

e

<hibernate-mapping>
	<class name="main.Opcional" table="opcional">
		
		<id name="id" unsaved-value="-1">
			<generator class="increment"/>
		</id>
		
		<property name="nome"/>
		
		<set name="carros" table="carro_opcional">
		
			<key column="idopcional"/>
			<many-to-many class="main.Opcional" column="idcarro"/>
		
		</set>
		
	</class>

</hibernate-mapping>

Infelizmente acho que ele não apaga so a associação.
Nesse caso vc teria que mapear a tabela associativa, apagar as associacoes e depois apagar o objeto desejado.

[quote=passos]Infelizmente acho que ele não apaga so a associação.
Nesse caso vc teria que mapear a tabela associativa, apagar as associacoes e depois apagar o objeto
desejado.[/quote]

Xiii, que inhânha!!! :cry:
Será que não tem alguma maneira de contornar isso?
Andei lendo a documentação e percebi que eles recomendam não abusar demais os mapeamentos. Eles até sugerem que se use dois mapeamentos one-to-many e many-to-one ao invés de um many-to-many.

Se alguém tiver alguma sugestão, por favor, poste-a aqui!
Obrigado!

Esse deve ser um dos motivos. Infelizmente eu acho que não tem como contornar… eu ja tive um problema parecido.

Sei que essa pergunta já foi feita a muito tempo, mas só para deixar claro para quem ainda lê este post: como se trata de um relacionamento bi-direcional, você tem que apagar a referência de ambos os lados. Exemplo:


     objA.removerDoRelacionamento(objB);
     objB.removerDoRelacionamento(objA);

Estou considerando que o método removerDoRelacionamento irá iterar sobre o set de objetos e remover o objeto desejado quando encontrado.

Abraços.