【问题标题】:JPA Entity still there after remove删除后 JPA 实体仍然存在
【发布时间】:2016-06-15 15:57:00
【问题描述】:

我正在尝试编写一个显示数据库中用户的 jsp 网页。该页面工作正常。

例如,可以通过单击页面上的链接从数据库中删除用户,但不幸的是,该用户仍会在下次加载页面时显示。重新加载页面后,用户消失了。我在 JPA 类中添加了 @Cacheable(false),但没有任何改变。

为了更好地理解示例工作流:

  1. 管理员点击用户管理(调用“showUserHandler”servlet)
  2. 页面正在加载数据库中的前 10 个用户
  3. 管理员删除用户(通过调用处理程序(MVC)/servlet)
  4. Servlet 删除用户并从点号 1 调用 showUserHandler
  5. 页面正在加载,显示 10 个用户,但删除的用户仍然存在
  6. 按 F5 或“重新加载”,用户消失了

用户被删除如下:

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

并加载用户:

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();

谁能告诉我怎么了?

【问题讨论】:

  • 能否分享第3步servlet的完整源代码,其中删除和调用showUserHandler?
  • 为什么不查看 JPA 提供者的日志呢?然后您会看到调用的 SQL 并知道它是否在数据存储中,并且可以查看它是否来自缓存。仅仅依赖 JPA API 调用就是把它当作一个大黑盒,根本没有调试太多
  • @SanjeevSaha 添加了源代码
  • @marian04 你能告诉我从数据库加载用户详细信息时浏览器上显示的完整网址吗?
  • @SanjeevSaha 添加了

标签: jpa sql-delete


【解决方案1】:

我认为当您删除实体时您的代码会抛出java.lang.IllegalArgumentException: Removing a detached instance,从而在您的事务中进行回滚。发生这种情况是因为您在不同的持久性上下文中加载和删除此实体。

您是否尝试在事务中调用find

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

【讨论】:

    猜你喜欢
    • 2011-03-25
    • 1970-01-01
    • 2012-11-20
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 2012-07-02
    • 1970-01-01
    相关资源
    最近更新 更多