unable the longer entitynotfoundexception java hibernate jpa persistence

the - Cómo resolver javax.persistence.EntityNotFoundException con JPA(no usando @NotFound)



entity no longer exists in the database (4)

¿Qué hay de agregar una prueba en la clase de entidad correspondiente?

public boolean getHasSecond() { if (this.Second != null) { return true; } else { return false; } }

De esta manera, puedes verificar si la relación existe ...

Estamos usando JPA para cargar algunas cosas de una base de datos. Algunas entidades pueden tener relaciones opcionales entre ellas, por ejemplo

@Entity public class First { .... @OneToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH}) @JoinColumns(value = { JoinColumn(name = "A_ID", referencedColumnName = "A_ID", insertable = false, updatable = false), JoinColumn(name = "B_ID", referencedColumnName = "B_ID", insertable = false, updatable = false)}) private Second second;

Cuando esta asociación está presente en la base de datos, todo está funcionando bien. Cuando no lo es, javax.persistence.EntityNotFoundException una javax.persistence.EntityNotFoundException
Lo que quiero es, en lugar de la excepción, tener este campo como NULL si la asociación no está presente.

He intentado varias cosas diferentes, por ejemplo, usando el opcional = true en la anotación de relación (que por cierto es la opción predeterminada), poniéndolo como Nullable, etc. Nada parece funcionar, parece que todas estas opciones están siendo ignoradas.

Encontré una gran cantidad de enlaces que mencionan este mismo problema (y algunas preguntas aquí en stackoverflow) pero en todos ellos la sugerencia es usar la anotación @NotFound de Hibernate. Pero NO queremos tener dependencias con Hibernate (queremos mantener todo JPA puro).

¿Alguno de ustedes sabe alguna otra forma de resolver esto?

¡Muchas gracias por toda tu ayuda!


Intenta agregar opcional = verdadero en la anotación de OneToOne.


A continuación hay una solución alternativa para este problema. Tuve que construir sobre una base de datos antigua donde las relaciones a veces eran corruptas. Así es como lo resolví usando solo JPA.

@PostLoad public void postLoad(){ try { if(getObject() != null && getObject().getId() == 0){ setObject(null); } } catch (EntityNotFoundException e){ setObject(null); } }


He encontrado el mismo problema. No siempre es reproducible, así que no puedo probarlo, pero aquí hay algunos pensamientos:

  1. La instancia de su Segunda clase se elimina, mientras que la instancia de la Primera clase no sabe nada al respecto.
  2. Necesita una forma de permitir que una instancia de First sepa, cuando se elimina su instancia de Second.
  3. La opción de cascada para eliminar no ayuda aquí.
  4. Puede intentar usar una relación bidireccional, cuando existe una instancia de Primera dentro de la instancia de Segundo. Le permite actualizar la instancia de Primero a través de la instancia de Segundo antes de eliminar el segundo
  5. Relación bidireccional: es malo Yo supondría en su caso, que Primero - es dueño de Segundo. No permita que ningún servicio elimine su Segunda instancia directamente. Deje que el servicio que funciona con instancias de primera instancia de quitar de segundo. En este caso, puede hacer que el campo "segundo" sea nulo en primer lugar, luego de eliminar la instancia de Segundo a través de EntityManager.
  6. Puede obtener una excepción cuando ejecuta consultas y la memoria caché de segundo nivel está habilitada y la consulta tiene una pista, lo que permite almacenar en caché su resultado. Yo le ofrecería obtener el resultado de las consultas a través del siguiente método:

private List<?> getQueryResult(final Query query) { try { return query.getResultList(); } catch (EntityNotFoundException e) { return query.setHint("javax.persistence.cache.storeMode", CacheStoreMode.REFRESH).getResultList(); } }

  1. Si trabaja con entidades a través de EntityManger, pero no a través de consultas, y obtiene una excepción porque la entidad está en caché, puede invalidar todas las entidades de Primero en caché cuando elimine Segundo.

Me gustaría discutir esta solución, ya que no puedo probarla y no puedo asegurar que funcione. Si alguien lo intenta, házmelo saber.

PD: si alguien tiene una prueba de unidad para hibernar, que reproduce este problema, ¿podrías avisarme? Deseo investigarlo más a fondo.