2010-12-02 16 views
5

¿Existe alguna forma más elegante de evitar javax.persistence.EntityNotFoundException al llamar al EntityManager.remove() en un objeto que puede o no existir actualmente en estado persistente? Estoy tratando de evitar una situación en la que necesito hacer 2 consultas para eliminar un objeto. Actualmente estoy haciendo trampa con:Hibernate Entitymanager eliminar elegantemente sin excepción?

void remove(String id) { 
    T model = entityManager.getReference(type, id); 
    entityManager.remove(model); 
} 

Pero esto arrojará una excepción si el modelo no existe.

pude:

void remove(String id) { 
    T model = retrieve(id); 
    if(model != null) 
     entityManager.remove(model); 
} 

Pero eso implicaría 2 consultas (dejando de lado la noción de una memoria caché por ahora).

+0

He votado por la captura de la excepción. A pesar de lo que dice la gente, la forma en que el sol ha programado a la api principal de Java, muchas veces una captura de prueba durante la ejecución normal está absolutamente bien. Justo el otro día encontré la fila 294 en 'ClassLoader.loadClass()' tratando de atrapar una excepción esperada en una clase * very * core. –

+0

Supongo que una excepción es igual de rápida/rápida que una consulta adicional en un MySQL db. – Finbarr

+0

Si tiene a mano la referencia del objeto, solo llame a entityManager.contains (obj); si devuelve false, ya lo habrá eliminado. (Esto no funcionará si solo tiene el ID, o puede haberlo eliminado en un contexto de persistencia diferente, obviamente, en cuyo caso una instrucción de eliminación de JPQL funcionaría). – JesperSM

Respuesta

0

La única posibilidad es utilizar una consulta con una cláusula DELETE y WHERE. Funciona bien, EXCEPTO que JPA no llamará a ninguna operación @PreDelete o @PostDelete en el objeto para eliminar. Supongo que no quiere eso de todos modos, así que vaya con la consulta. Si desea llamar a los oyentes, el objeto (obviamente) debe cargarse antes de la eliminación.

0

Puede hacer un select count(*) from ENTITY where id = :id antes de eliminar su entidad y luego verificar si la entidad existe en la base de datos. Entonces puedes eliminar sin excepción. Si está utilizando un DAO genérico con métodos comunes como find(), persist(), remove() ... puede agregar la consulta count(*) en el método remove().

Espero que ayude.

Cuestiones relacionadas