【问题标题】:Hibernate Entitymanager remove elegantly without exception?Hibernate Entitymanager 无一例外地优雅删除?
【发布时间】:2011-05-19 02:18:25
【问题描述】:

在当前可能存在或不存在于持久状态的对象上调用 EntityManager.remove() 时,是否有更优雅的方法来避免 javax.persistence.EntityNotFoundException?我试图避免需要进行 2 次查询才能删除对象的情况。目前我在作弊:

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

但是如果模型不存在,这会抛出异常。

我可以:

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

但这将涉及 2 次查询(暂时搁置缓存的概念)。

【问题讨论】:

  • 我投票赞成捕获异常。不管人们怎么说,sun 自己编写 java main api 的方式,在正常执行期间多次尝试捕获绝对没问题。就在前几天,我在 ClassLoader.loadClass() 中发现了第 294 行,尝试在 very 核心类中捕获预期的异常。
  • 我认为异常可能与 MySQL 数据库上的附加查询一样快/快。
  • 如果您有方便的对象引用,只需调用 entityManager.contains(obj) - 如果它返回 false,则您已经将其删除。 (如果您只有 ID,或者可能已经在不同的持久性上下文中删除了它,这将不起作用,显然,在这种情况下,JPQL 删除语句将起作用。

标签: java jpa


【解决方案1】:

您可以在删除实体之前执行select count(*) from ENTITY where id = :id,然后检查该实体是否存在于数据库中。所以你可以毫无例外地删除。如果您使用通用 DAO 和 find()persist()remove()...等常用方法,您可以在 remove() 方法中添加 count(*) 查询。

希望对你有帮助。

【讨论】:

    【解决方案2】:

    唯一的可能是使用带有 DELETE 和 WHERE 子句的查询。工作正常,除了 JPA 不会对要删除的对象调用任何 @PreDelete 或 @PostDelete 操作。我想你无论如何都不想这样,所以去查询。如果你想调用监听器,对象(显然)必须在删除之前加载。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-09
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-03
      • 2021-11-24
      相关资源
      最近更新 更多