2011-03-14 12 views
5

Mi proyecto actual usa HSQLDB2.0 y JPA2.0.EntityManager no actualiza los datos después de consultar

El escenario es: consulto DB para obtener la lista de contactDetails de person. Borro solo contactInfo en la interfaz de usuario pero no guardo esa información (Cancelar la parte de guardado).

De nuevo hago la misma consulta, ahora la lista de resultados es 1 menos que el resultado anterior porque he eliminado un contactInfo en la interfaz de usuario. Pero ese contactInfo todavía está disponible en DB si hago una verificación cruzada.

Pero si incluyo entityManager.clear() antes del inicio de la consulta, obtengo los resultados correctos todo el tiempo.

No entiendo este comportamiento. ¿Alguien podría dejarlo en claro para mí?

Respuesta

15

en lugar de consultar de nuevo, intente esto:

entityManager.refresh(person); 

Un ejemplo más completo:

EntityManagerFactory factory = Persistence.createEntityManagerFactory("..."); 
EntityManager em = factory.createEntityManager(); 
em.getTransaction().begin(); 

Person p = (Person) em.find(Person.class, 1); 
assertEquals(10, p.getContactDetails().size()); // let's pretend p has 10 contact details 
p.getContactDetails().remove(0); 
assertEquals(9, p.getContactDetails().size()); 

Person p2 = (Person) em.find(Person.class, 1); 
assertTrue(p == p2); // We're in the same persistence context so p == p2 
assertEquals(9, p.getContactDetails().size()); 

// In order to reload the actual patients from the database, refresh the entity 
em.refresh(p); 
assertTrue(p == p2); 
assertEquals(10, p.getContactDetails().size()); 
assertEquals(10, p2.getContactDetails().size()); 

em.getTransaction().commit(); 
em.close(); 
factory.close(); 
+1

¡Esto vivió mi vida! – riship89

2

El comportamiento de clear() se explica en su javadoc:

Borrar el contexto de persistencia, haciendo que todas las entidades gestionadas que se desprendan. Los cambios realizados en las entidades que no se han descargado a la base de datos no se conservarán.

Es decir, la eliminación de contactInfo no se conserva.

ContactInfo no está recibiendo retira de la base de datos porque se quita la relación entre ContactDetails y ContactInfo, pero no ContactInfo sí. Si desea eliminarlo, debe hacerlo explícitamente con remove() o especificar orphanRemoval = true en la relación.

+0

Parece que no quiere que se elimine ya que ha cancelado la eliminación real, pero se pregunta por qué la próxima vez que consulta la base de datos ese elemento no se vuelve a poner en la colección. – Behrang

Cuestiones relacionadas