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