Hibernate - Ignorar integridade referencial na recuperação de um objeto

Senhores,
Na recuperação de um objeto composto da minha aplicação, a seguinte exceção é lançada:

org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [br.com.cnnt.imanagerweb.beans.Unidade#11]

O problema é que na tabela que representa o objeto composto, a chave estrangeira correspondente ao objeto componente aponta para um valor nulo. No meu caso, não existe um objeto Unidade com o ID 11, mas meu objeto composto aponta para ele.

Quando esta exceção é lançada, o objeto não é retornado. Gostaria saber se há algum modo de ignorar este erro de integridade (tendo em vista que a base do cliente não pode ser alterada por mim) trazendo o objeto componente com o valor nulo.

Desde já agradeço

[quote=xgucax]Senhores,
Na recuperação de um objeto composto da minha aplicação, a seguinte exceção é lançada:

org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [br.com.cnnt.imanagerweb.beans.Unidade#11]

O problema é que na tabela que representa o objeto composto, a chave estrangeira correspondente ao objeto componente aponta para um valor nulo. No meu caso, não existe um objeto Unidade com o ID 11, mas meu objeto composto aponta para ele.

Quando esta exceção é lançada, o objeto não é retornado. Gostaria saber se há algum modo de ignorar este erro de integridade (tendo em vista que a base do cliente não pode ser alterada por mim) trazendo o objeto componente com o valor nulo.

Desde já agradeço
[/quote]

Sua base de dados está com um sério problema de design… voce deve ativar as constraints do seu banco para evitar esse tipo de “XUNXO”…

se nao existe reg 11 , este campo OU deveria estar NULL OU deveria ter seu registro apagado…

Para evitar a carga de relacionamentos use LAZY=true no mapeamento… porem isso vai ser apenas paleativo… voce terá que corrigir isso.

[quote=chun][quote=xgucax]Senhores,
Na recuperação de um objeto composto da minha aplicação, a seguinte exceção é lançada:

org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [br.com.cnnt.imanagerweb.beans.Unidade#11]

O problema é que na tabela que representa o objeto composto, a chave estrangeira correspondente ao objeto componente aponta para um valor nulo. No meu caso, não existe um objeto Unidade com o ID 11, mas meu objeto composto aponta para ele.

Quando esta exceção é lançada, o objeto não é retornado. Gostaria saber se há algum modo de ignorar este erro de integridade (tendo em vista que a base do cliente não pode ser alterada por mim) trazendo o objeto componente com o valor nulo.

Desde já agradeço
[/quote]

Sua base de dados está com um sério problema de design… voce deve ativar as constraints do seu banco para evitar esse tipo de “XUNXO”…

se nao existe reg 11 , este campo OU deveria estar NULL OU deveria ter seu registro apagado…

Para evitar a carga de relacionamentos use LAZY=true no mapeamento… porem isso vai ser apenas paleativo… voce terá que corrigir isso.[/quote]

Olá chun,
Eu sei que isto é um grande problema. Creio que não me expressei bem, mas a base de dados não é minha nem muito menos pode ser alterada por mim. a única coisa que posso fazer é CRUD sobre os registros (no caso de remoção me foi orientado que não alterasse os dados já existentes, ou seja, removesse apenas aquilo que insiro).

A opção de Lazy=true não é interessante para mim pois preciso destes objetos (para os que existam).
Pensei em criar algum método que parseasse estes erros por exemplo, criasse projeções que não contém os objetos componentes e tentasse inicializá-los. Caso houvesse sucesso na inicialização, o objeto seria retornado completo. Caso contrário, retornasse null.
O problema desta abordagem é que eu teria que reescrever muito código (código que teoricamente está correto para uma base correta). Aí gostaria de saber se não existe algum recurso 9de mapeamento, ou outro tipo) para isto
Abraços

sim Existe uma maneira de Ignorar este erro:

Adicione no mapeamento annotation esse codigo:
@NotFound(action=NotFoundAction.IGNORE)

Lembrando que esse annotation apenas vai mascarar o erro… e não trata-lo

Se alguem discorda por favor , comente
Atenciosamente,

No mínimo é mySQL. :roll:

Este não é um problema do banco, mas sim do DBA que cria tabelas tão frágeis assim. Já encontrei o mesmo problema em um banco Oracle 10 em uma grande empresa.

O MySQL é um excelente banco de dados.

comigo esta acontecendo o mesmo problema, em um relacionamento muitos para um! como resolvo esse caso ? creio que era apra retornar nulo!

[quote=xgucax][quote=chun][quote=xgucax]Senhores,
Na recuperação de um objeto composto da minha aplicação, a seguinte exceção é lançada:

org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [br.com.cnnt.imanagerweb.beans.Unidade#11]

O problema é que na tabela que representa o objeto composto, a chave estrangeira correspondente ao objeto componente aponta para um valor nulo. No meu caso, não existe um objeto Unidade com o ID 11, mas meu objeto composto aponta para ele.

Quando esta exceção é lançada, o objeto não é retornado. Gostaria saber se há algum modo de ignorar este erro de integridade (tendo em vista que a base do cliente não pode ser alterada por mim) trazendo o objeto componente com o valor nulo.

Desde já agradeço
[/quote]

Sua base de dados está com um sério problema de design… voce deve ativar as constraints do seu banco para evitar esse tipo de “XUNXO”…

se nao existe reg 11 , este campo OU deveria estar NULL OU deveria ter seu registro apagado…

Para evitar a carga de relacionamentos use LAZY=true no mapeamento… porem isso vai ser apenas paleativo… voce terá que corrigir isso.[/quote]

Olá chun,
Eu sei que isto é um grande problema. Creio que não me expressei bem, mas a base de dados não é minha nem muito menos pode ser alterada por mim. a única coisa que posso fazer é CRUD sobre os registros (no caso de remoção me foi orientado que não alterasse os dados já existentes, ou seja, removesse apenas aquilo que insiro).

A opção de Lazy=true não é interessante para mim pois preciso destes objetos (para os que existam).
Pensei em criar algum método que parseasse estes erros por exemplo, criasse projeções que não contém os objetos componentes e tentasse inicializá-los. Caso houvesse sucesso na inicialização, o objeto seria retornado completo. Caso contrário, retornasse null.
O problema desta abordagem é que eu teria que reescrever muito código (código que teoricamente está correto para uma base correta). Aí gostaria de saber se não existe algum recurso 9de mapeamento, ou outro tipo) para isto
Abraços[/quote]

Conseguiu resolver este problema ?

quando o relacionamento não for obrigatório utilizo isso!

@OneToOne(optional=true)

[quote=viniciuspadua]quando o relacionamento não for obrigatório utilizo isso!

@OneToOne(optional=true) [/quote]

E para

@OneToMany
@ManyToOne

Obrigado !!!

todos tem o optional!

Nao @OneToMany

Mesmo colocando optional=true ainda continuo tomando exception

org.hibernate.ObjectNotFoundException: No row with the given identifier exists:

Mostre seu mapeamento

Sobre o meu problema e o seguinte estava dando uma olhada na documentacao do Hibernate e reparei a seguinte situacao hoje estou usando.

load()

super.getHibernateTemplate().load(OpeOrdem.clazz, opeOrdem);

caso nao exista este ID retorno e exception org.hibernate.ObjectNotFoundException

caso se eu usar o get()

super.getHibernateTemplate().get(OpeOrdem.clazz, opeOrdem);

caso nao exista este ID retorno null

Isso esta certo e que no meu caso estou fazendo uma consulta pela primary key de meu banco para nao precisar criar CRITERIA resolvi usar o load para encurtar o tempo de desenvolvimento.