Hibernate - Erro ao excluir registro pai e filho

Ola,

Ao executar um delete (que exclui o pai e o filho ao mesmo tempo), o hibernate esta lançando a seguinte exception:

org.hibernate.StaleStateException: Batch update returned unexpected row count from update: 0 actual row count: 0 expected: 1

Abaixo o código e os mapeamentos. Obs: A pesquisa funciona sem erros.

Session session = ConectaHibernate.getSession();
TipoDocumentoORM tip = (TipoDocumentoORM)session.get(TipoDocumentoORM.class,new Integer(tipodocumento));

Transaction tx = session.beginTransaction();
session.delete(tip);
session.flush();
tx.commit();
session.close();

O erro da no “flush”… abaixo os mapeamentos …

Classe “Pai”

<?xml version="1.0"?>
<id column="doctipcod" name="codigoTipoDocumento" type="int"/>

<property column="doctipdes" name="descricaoTipoDocumento" not-null="true" type="string"/>
<property column="caddat" name="dataCadastro" not-null="true" type="java.util.Date"/>
<property column="dsctmp" name="tempoDisco"   not-null="true" type="int"/>
<property column="arqrep" name="pathDisco"    not-null="true" type="string"/>


<set name="chavesTipoDocumento"
	  lazy="false"
	  inverse="false"
	  outer-join="false"
	  cascade="all"
	  order-by="chvcod"
>
		<key>
			<column name="doctipcod" />
		</key>
		<one-to-many class="ChavePesquisaORM" />
</set>	

Classe “FILHA”

<?xml version="1.0"?>
<composite-id >
   <key-many-to-one name="tipoDocumento" class="TipoDocumentoORM" column="doctipcod"  />
   <key-property name="codigoChave" column="chvcod" type="int"/>
</composite-id>

<property column="chvnom" name="nomeChave" not-null="true" type="string"/>

Se vc quer que o delete exclua o pai e o filho ao mesmo tempo marca la no banco a opção delete on cascade.

Acho que isso resolve.

Faz isso na configuração do próprio hibernate, acho que pode usar cascade no xml também sem problema.

Eu tive uma experiencia dessas e só usar cascade=“all” no XML não resolveu não. Ele continua sem deletar nada.

Tentei outras configurações do cascade como all-delete-ropahan e nada. Se tiver outra marcação XML para isso eu desconheço.

Valeu

Ola,

Obrigado por responder…

A configuração que vc’s estão falando é essa ?

<set name=“chavesTipoDocumento”
lazy=“false”
inverse=“false”
outer-join=“false”
cascade=“all”
order-by=“chvcod”

O cascade “all” já não deveria ter o “delete” incluido ?
De qualquer forma, foi testar todas as opções…

Valeu…

Ola !

Não tem jeito, não esta funcionando, tentei todas as opções… alguém sabe o que pode estar acontecendo ??

Só não da erro quando eu coloco “none”, mas aí ele não deleta o filho…

Erro:
org.hibernate.StaleStateException: Batch update returned unexpected row count from update: 0 actual row count: 0 expected: 1

Valeu
Renato.

Você precisa desfazer a associacão bidirecional entre o lado 1 do relacionamento, e o lado N. Exemplo:

class Noticia {
  Set fotos;

  void addFoto(Foto foto) {
    fotos.add( foto );
    foto.setNoticia( this );
  } 
}

Assim é feita a associacão bidirecional. Antes de remover a instancia de Foto, eu preciso desfazer essa associacão - remove() na Collection, e setNoticia( null ) na class Foto - para que o Hibernate consiga efetuar o Cascade…

Posso estar enganado, não manjo muito de hibernate, mas verifique as suas associacões…

Rodrigo

Ok, setei o campo “SET” para nullo e funcionou em partes.
Não deu a exception, mas o hibernate não excluiu o filho, ele deu um update do campo para nullo :shock:

Alguém sabe porque o hibernate atualiza o registro para nullo ao invés de deleta-lo ? Qual configuração esta errada ?

Obrigado
Renato.

No mapeamento, as propriedades “nullable” e “updatable” ajudam a definir esse comportamente. Se algo é ‘nullable’, não é campo obrigatório (not null) em banco. Se uma relacão não for ‘updatable’ (updatable=false) no mapeamento, o Hibernate não vai executar updates para ela.

No teu caso, o cascade type ALL servirá… Junto com o tratamento do relacionamento no lado Java (bidirecional ou unidirecional, como queira), e o correto mapeamento em xml para refletir o relacionamento em banco.

A documentacão do hibernate é sua amiga :wink:

Rodrigo

Pois é, já tentei de tudo … a documentação do hibernate é meia boca, não encontrei nada sobre esse erro…

O problema destes frameworks é esse… quando da estes “erros alienigenas” a gente perde muito tempo para fazer coisas básicas.
Com JDBC já teria resolvido faz tempo …

Obrigado pela ajuda…

Renato.