【问题标题】:JPA: EntityManager delete/updateJPA:EntityManager 删除/更新
【发布时间】:2015-12-29 14:42:28
【问题描述】:

当我调用EntityManager 的update 或remove 方法时,我首先需要通过调用find() 来管理实体。但这意味着两次访问数据库。是我做错了还是唯一的方法?

【问题讨论】:

  • EntityManager 没有像update() 这样的方法。请清楚术语的使用。尽可能在删除实体之前使用EntityManager#getReference()。合并操作是另一回事,您将分离或非托管实体传递给 EntityManager 以使其成为托管实体。
  • 抱歉用错了词...合并。

标签: jpa entitymanager


【解决方案1】:

我不确定我是否理解正确。但是如果你的意思是你必须做类似的事情 Employee employee = em.find(Employee.class, 1); em.getTransaction().begin(); em.remove(employee); em.getTransaction().commit();

那么是的,你必须这样做:)

【讨论】:

    【解决方案2】:

    要使用“EntityManager”的mergeremove 方法,您需要在参数中传递实体对象。

    您也可以使用native queries (em.createNativeQuery),它允许您执行任何您想要的请求。

    毕竟,JPA 有一个缓存层来防止不必要的请求一路到达 DB。当您调用find(id) 时,如果此后未修改,JPA 将首先尝试从缓存中检索它。

    所以,别担心

    【讨论】:

    • ...但是如果它在持久上下文中找不到它,那么它将从 DB 中获取它。所以如果我想删除实体,那么调用 find 将进行 DB 访问以获取它并然后调用 delete() 将进行另一个调用。如果我不调用 find() 那么 delete 不会做任何事情。行仍然在表中。我正在使用 OpenJPA。
    • 是的!可能是你的情况,你需要使用native query
    • 尝试使用entityManager.flush(); 强制同步您的persistentContext whith DB
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    • 2019-05-16
    • 1970-01-01
    • 2017-08-16
    相关资源
    最近更新 更多