Hibernate - Erro ao excluir registro pai e filho

9 respostas
R

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"/>

9 Respostas

nilolima

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.

javaBeats

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

nilolima

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

R

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…

R

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.

javaBeats

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

R

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.

javaBeats

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

R

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.

Criado 24 de agosto de 2006
Ultima resposta 26 de ago. de 2006
Respostas 9
Participantes 3