【发布时间】: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 删除语句将起作用。