Hibernate - cascade só funciona para adicionar, e não para remover pq?

6 respostas
M

seguinte possuo um metodo que faz o seguinte:

//logica
usuario.setEmpresas(empresas); //passo a lista de empresas e ele adiciona corretamente
DAOUsuario.update(usuario);
//logica

até ae tudo bem, quando é pra adicionar ele faz isso corretamente, mais suponha que eu tenho agora 8 empresas para esse usuario e agora removi 3 empresas dessa LISTA, e faço novamente

//logica
usuario.setEmpresas(empresas);
DAOUsuario.update(usuario);
//logica

ele não remove as 3 que removi da lista, é como se ele somente adicionasse e não pode remover.

e coloquei para que o cascade seja "all"

segue meu mapeamento:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="br.com.rhunificado.model">
	<class name="Usuario" table="usuario">
		<id name="codigo" column="codigo" type="int">
			<generator class="sequence">
                <param name="sequence">usuario_sequence</param>
                <param name="parameters">START WITH 2</param>
            </generator>
		</id>
		
		<property name="nome" column="nome" type="string"/>
		<property name="login" column="login" type="string"/>
		<property name="senha" column="senha" type="string"/>
		<property name="ativo" column="ativo" type="boolean"/>
		
		<set name="permissao" table="usuario_permissao" cascade="all">
		    <key column="usuario"/>
		    <element column="permissao" type="string"/>
		</set>
        
        <list name="empresas" cascade="all">
	      	<key column="codigoDoUsuario" not-null="true"/>
	      	<list-index column="companyIdx"/>
	      	<one-to-many class="br.com.rhunificado.model.UsuarioCompany"/>
   		</list>
	</class>
	
</hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="br.com.rhunificado.model">
	<class name="UsuarioCompany" table="usuario_company">
		<id name="codigo" column="codigo" type="int">
			<generator class="native"/>
		</id>
        
        <many-to-one name="codigoDoUsuario" column="codigoDoUsuario" not-null="true" insert="false" update="false" class="br.com.rhunificado.model.Usuario"/>
		
		<property name="codigoExterno" column="codigoExterno" type="int"/>
		
			
	</class>
</hibernate-mapping>

6 Respostas

Hebert_Coelho

O que você espera que o hibernate faça? Apague do banco os itens removidos?

M

correto, basicamente seria o seguinte, se eu adicionar na lista, 8 empresas, ele adicione as 8 empresas, se eu fui na lista e removi 3 empresas e atualizei a tabela, quero que ele remova essas 3 empresas que removi da lista.

ja fui na api do hibernate e não encontro alguma propriedade que me de esse tipo de ação.

Hebert_Coelho

maaarkin:
correto, basicamente seria o seguinte, se eu adicionar na lista, 8 empresas, ele adicione as 8 empresas, se eu fui na lista e removi 3 empresas e atualizei a tabela, quero que ele remova essas 3 empresas que removi da lista.

ja fui na api do hibernate e não encontro alguma propriedade que me de esse tipo de ação.

Não é assim que o cascade funciona.

Esse post explica para que serve o cascade: http://uaihebert.com/?p=1622

O que você quer é o orphanRemoval que também é explicado no post, mas não sei se sua versão do hibernate dá suporte.

M

Ok, vou procurar sobre, já é um caminho a seguir, obrigado Hebert

M

Hebert, tem como por exemplo, eu sobrepor a lista que já existe? por exemplo limpar as empresas desse usuario em específico e setar as novas? pq esse orphan removal nao está funcionando na minha aplicação.

Hebert_Coelho

maaarkin:
Hebert, tem como por exemplo, eu sobrepor a lista que já existe? por exemplo limpar as empresas desse usuario em específico e setar as novas? pq esse orphan removal nao está funcionando na minha aplicação.
Mesmo que você sobreponha os valores antigos vão continuar lá.

Criado 27 de maio de 2013
Ultima resposta 27 de mai. de 2013
Respostas 6
Participantes 2