Hibernate: delete + update com a mesma sessão

3 respostas
C

Pessoal,

Por favor, me tirem essa dúvida:

Tenho a classe Pessoa, contendo um set de EnderecoPessoa (que tbém
contém a classe Endereco, tabela “endereco” no bd) para ser persistida
no postgres usando hibernate. Assim, a classe EnderecoPessoa (tabela
"endereco_pessoa" no bd) é composta por codigo_pessoa (on update
CASCADE, on delete CASCADE) e codigo_endereco (on update CASCADE, on
delete CASCADE).

Estou usando a classe PessoaDAO para gravação no bd, e ocorre erro na
seguinte situação:

  • a partir de um registro existente na tabela “pessoa”, contendo 2
    "endereco_pessoa", preciso excluir um deles e atualizar o outro;

  • assim eu faço um Session.delete() em “endereco” (não em
    "endereco_pessoa"), seguido de um Session.updateOrSaveCopy() na outro
    "endereco" (não em “endereco_pessoa” tbém), e depois ainda faço um
    Session.updateOrSaveCopy() em “pessoa” (atualizando o set de
    EnderecoPessoa), tudo isso usando um único Session e um Transaction.

Assim eu recebo a exception:

net.sf.hibernate.ObjectDeletedException: The object with that id was deleted: EnderecoPessoaPK@5dbc82[cdPessoa=2,cdEndereco=6], of class: EnderecoPessoa

E aí eu pergunto: o que está errado?? e qual tabela devo excluir para executar minha operação??

Desde já agradeço a atenção…

[]'s

3 Respostas

Mauricio_Linhares

Você coloca o atributo “cascade” do Set pra “all-delete-orphan” e simplesmente retira o Endereço do Set de endereços em Pessoa, depois você adiciona o novo endereço ao Set e dá um commit na transação, o Hibernate vai excluir o Endereço que você retirou da coleção (por causa do “all-delete-orphan”) e vai adicionar o novo.

C

Pois é Maurício,

Eu coloquei o “all-delete-orphan” em Pessoa.hbm, no Set de “EnderecoPessoa” (não em Endereco, pois esse a classe Pessoa não possui diretamente), e para excluir um endereço eu apenas o retirei do Set (em Pessoa). Eu não mexi em nenhuma configuração do banco, só no HBM mesmo. Me corrija se estiver fazendo algo errado.

Mas o erro que recebi foi esse:

net.sf.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations): EnderecoPessoaPK@101fa9e[cdPessoa=1,cdEndereco=5], of class: EnderecoPessoa
	at net.sf.hibernate.impl.SessionImpl.forceFlush(SessionImpl.java:760)
	at net.sf.hibernate.impl.SessionImpl.save(SessionImpl.java:738)
	at net.sf.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:1384)
	at net.sf.hibernate.engine.Cascades$4.cascade(Cascades.java:114)
	at net.sf.hibernate.engine.Cascades.cascade(Cascades.java:436)
	at net.sf.hibernate.engine.Cascades.cascadeCollection(Cascades.java:526)
	at net.sf.hibernate.engine.Cascades.cascade(Cascades.java:452)
	at net.sf.hibernate.engine.Cascades.cascade(Cascades.java:503)
	at net.sf.hibernate.engine.Cascades.cascade(Cascades.java:482)
	at net.sf.hibernate.impl.SessionImpl.preFlushEntities(SessionImpl.java:2692)
	at net.sf.hibernate.impl.SessionImpl.flushEverything(SessionImpl.java:2269)
	at net.sf.hibernate.impl.SessionImpl.flush(SessionImpl.java:2258)
	at net.sf.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:61)

Alguma luz?

Mauricio_Linhares

Veja a mensagem:

Ele está dizendo que você não removeu os relacionamentos, provavelmente EndereçoPessoa continua apontando pra Pessoa (ou pra alguma outra classe relacionada).

Criado 26 de julho de 2005
Ultima resposta 27 de jul. de 2005
Respostas 3
Participantes 2