2011-08-22 19 views
6

A veces es bastante difícil (o un problema de rendimiento) limpiar borrar todas las referencias a una entidad.Error de "Entidad no encontrada" de derivación con JPA

Por ejemplo, tengo un objeto Person que tiene relaciones con otros objetos Person.

Cuando elimino una Persona, no quiero eliminarla en todas las relaciones que pueda tener simplemente porque a veces este objeto Persona no sabe a qué referencia se refiere. Por lo tanto, si me gustaría eliminar todas las referencias, debo hacer un trabajo extra SQL que puede ocasionar problemas de rendimiento.

En un mundo ideal, me gustaría eliminar el objeto Person y cuando otra Persona hace una referencia a esta Persona (porque tiene su id en sus relaciones), simplemente devuelve null.

El hecho es JPA se queja de que

javax.persistence.EntityNotFoundException: No row with the given identifier exists 

¿Hay una manera de forzar la APP para devolver una referencia nula y no una excepción en este caso?

Respuesta

16

Puede utilizar la anotación @NotFound con el valor NotFoundAction.IGNORE, que devolverá nulo si una entidad asociada no existe.

Una palabra de advertencia: si usa esto en una colección e hibernate no encuentra una de las entradas, agregará un valor nulo en la colección, lo cual es muy molesto. Para evitar esto, puede envolver la colección en una Colección que omite nulos.

+0

eso era exactamente lo que estaba buscando! Muchas gracias. Esto es específico de hibernación, ¿no es así? –

+1

Me alegro de que haya sido de ayuda, y sí, la anotación es específica de hibernación – Augusto

+0

@Augusto ¿Por qué Spring Data arroja esta excepción en primer lugar? – svlada

5

No, al menos no estándar (APP)

Pero se puede controlar lo que sucede con estas asociaciones con el cascade atribuyen ot @*ToMany y @*ToOne anotaciones.

0

Utilizaría @NotFound (action = NotFoundAction.IGNORE) Esto omitirá las entidades nulas. PERO (como dijo Augusto) si está utilizando por ejemplo Primefaces Datatable y obtiene 10 filas y se salteó 2, debido a @NotFound (action = NotFoundAction.IGNORE) en su propiedad, tendrá 10 filas y no 8 (filas fantasmas en realidad).

@NotFound(action=NotFoundAction.IGNORE) 
private Product p; 
Cuestiones relacionadas