[HIBERNATE] Num relacionamento, como compensar registros órfãos na tabela referenciada?

4 respostas
bigjoe

Boa tarde!

Pessoal, estou com um problema sério no meu trabalho e gostaria de saber se os colegas têm alguma dica de configuração do Hibernate.

Eu tenho uma tabela que é gerenciada pela minha aplicação que usa dados de outra tabela, sendo que esta é controlada sabe deus por quem e sobre a qual eu não tenho a menor influência - ela é corporativa.

Vamos supor que a minha tabela seja de produto e a outra, fornecedor do produto. Teríamos

[size=9]
PRODUTO
id_produto
desc_produto
id_fornecedor

[/size]
e

[size=9]FORNECEDOR
id_fornecedor
desc_fornecedor

[/size]
Eu mapeei produto com fornecedor usando @ManyToOne. Entregamos o sistema e um dos usuários apontou um erro. Fui verificar e descobri que havia dois produtos no banco de dados cujos fornecedores foram deletados. Perguntei a respeito e a explicação que me deram foi muito sucinta: quando o fornecedor não trabalha mais conosco, nós o deletamos da tabela corporativa e ponto final. Ou seja, posso ter produtos cujos fornecedores não existem mais no banco de dados nem em tabelas de histórico nem persistidos com uma flagzinha de status.

Há alguma configuração do annotations que me permita contornar isso, do tipo ‘se achar um erro, não prossiga o fetch e retorne null’? Do jeito que está, acarreta, compreensivelmente, [color=red]org.springframework.orm.hibernate3.HibernateObjectRetrievalFailureException: No row with the given identifier exists[/color]. Foi solicitado que o hibernate detecte esse problema e o compense trazendo null em vez de disparar um erro.

Eu não posso mexer na tabela corporativa, não posso colocar campos e qualquer solução deverá partir da minha solução.

Alguém tem alguma idéia de como posso fazer isso?

grande abraço,
obrigado,

Joe

PS: tenho idéias de como resolver refazendo produto para só buscar fornecedor quando assim for requistado, mas vai me obrigar a mexer em boa parte da aplicação.

4 Respostas

E

Cara, não sei se entendi muito bem, mas vc ja tentou algo como
@ManyToOne(optional=true)

?

bigjoe

Já, optional = true está lá registrado.

Só para esclarecer com um exemplo:

Se a tabela PRODUTO tem:

id = 1, desc_produto = ‘a’, id_fornecedor = 10
id = 2, desc_produto = ‘b’, id_fornecedor = 11

E FORNECEDOR tem:

id_fornecedor = 10, desc_fornecedor = 'hhh’
id_fornecedor = 11, desc_fornecedor = ‘mmm’

Desse jeito, está tudo ok.

Porém, o cliente pode, arbitrária e imprevisivelmente, deletar, digamos, o id_fornecedor = 10, sem alterar o produto id = 1, o que causa uma inconsistência no banco. E isso provoca um erro quando o hibernate tenta carregar o produto id = 1.

O que eu queria era tentar achar um jeito de configurar o hibernate para, não achando o relacionamento, não estourar.

Obrigado pelo seu tempo e atenção!

Abraços

bigjoe

Galera,

resolvi o problema! :slight_smile:

Existe uma annotation chamada @NotFound, que prevê esses casos.

Então, no meu relacionamento, fiz:

@ManyToOne @NotFound(action=NotFoundAction.IGNORE) public Fornecedor getFornecedor() { ... }

Fica a dica para quem passar por esse mesmo problema. Moderação, pode marcar o tópico como resolvido.

Obrigado,

Joe

E

Poxa, essa eu não conhecia.

Anotado!!!

vlw

Criado 20 de julho de 2009
Ultima resposta 21 de jul. de 2009
Respostas 4
Participantes 2