Hibernate: delete + update com a mesma sessão

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

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.

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?

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).