2016-06-15 18 views
0

Ich versuche, eine JSP-Webseite zu codieren, die Benutzer in der Datenbank zeigt. Die Seite funktioniert korrekt.JPA-Entity immer noch nach dem Entfernen

Zum Beispiel ist es möglich, Benutzer aus der Datenbank zu entfernen, indem Sie auf einen Link auf der Seite klicken, aber leider wird der Benutzer immer noch beim nächsten Laden der Seite angezeigt. Nach dem erneuten Laden der Seite ist der Benutzer verschwunden. Ich fügte der JPA-Klasse einen @Cacheable(false) hinzu, aber nichts änderte.

Zum besseren Verständnis ein Beispiel-Workflow:

  1. Admin Klicks auf Benutzerverwaltung ("showUserHandler" Servlet-Aufruf)
  2. Seite mit den ersten 10 Benutzer aus der Datenbank geladen
  3. Admin löscht Benutzer (durch Aufruf eines Handlers (MVC)/Servlet)
  4. Servlet löscht den Benutzer und ruft den showUserHandler von Punkt Nummer 1
  5. Seite wird geladen, zeigt 10 Benutzer, aber der gelöschte Benutzer i s gibt es noch
  6. Drücken Sie F5, oder "Neu laden" und der Benutzer wird

Der Benutzer weg wie entfernt wird:

Users user = em.find(Users.class, request.getParameter("uId")); 
if (user != null) { 
em.getTransaction().begin(); 
em.remove(user); 
em.getTransaction().commit(); 
em.close(); 
} 

und Laden des Benutzers:

EntityManager em = SessionUtil.createManager(); 
List<Users> usersList = em.createNamedQuery("Users.findAllOrdered", Users.class).setParameter("uId", Integer.parseInt(request.getParameter("lastID"))).setFirstResult(0).setMaxResults(10).getResultList(); 

Kann jemand Sag mir was los ist ?

+0

Können Sie den vollständigen Quellcode von Schritt 3 Servlet, wo Löschung und Aufruf von showUserHandler stattfindet, freigeben? –

+1

Warum nicht im Protokoll des JPA-Anbieters suchen? dann sehen Sie, dass das SQL aufgerufen wird und WISSEN, ob es sich im Datenspeicher befindet oder nicht und ob es aus dem Cache kommt oder nicht. Sich nur auf JPA-API-Aufrufe zu verlassen, behandelt es als eine große Black Box und Debugging überhaupt nicht –

+0

@SanjeevSaha Quellcode hinzugefügt – marian04

Antwort

0

Ich denke, Ihr Code wirft eine java.lang.IllegalArgumentException: Removing a detached instance, wenn Sie die Entität entfernen, ein Rollback in Ihrer Transaktion. Dies geschieht, weil Sie diese Entität in einem anderen Persistenzkontext laden und entfernen.

Haben Sie versucht, die find innerhalb Ihrer Transaktion aufzurufen?

em.getTransaction().begin(); 
Users user = em.find(Users.class, request.getParameter("uId")); 
if (user != null) { 
em.remove(user); 
em.getTransaction().commit(); 
em.close(); 
} 
Verwandte Themen