2

在我的 Play2 应用程序中,我有一个名为user的模型类。它包含一个删除方法:

public static void delete(Long id) {
    find.ref(id).delete();
}

我的控制器中的删除操作如下所示:

public static Result deleteUser(Long id) {
    User user = User.find.ref(id);
    if(user == null) {
        return notFound();
    } else {
        User.delete(id);
        return ok();
    }
}

如果用户存在,我的目的是在尝试删除它之前给出反馈。否则,如果用户不存在,我总是会收到以下异常:

[OptimisticLockException:数据已更改。更新了 [0] 行 sql[从 id=? 的用户中删除]

但是find.ref我在控制器中使用的方法永远不会返回null,无论用户是否存在。因此,删除方法总是被调用,并且我上面提到的异常会引发。

如何正确地做到这一点?我可以使用find.byId代替find.ref(byId 应按预期返回 null),但我不想加载整个数据以检查用户是否存在。

编辑:除了上面的问题,为什么我在尝试删除不存在的用户时会收到 OptimisticLockException?对我来说没有意义...

4

1 回答 1

1

试试这个:

public static Result deleteUser(Long id) {
    User user = User.find.byId(id);
    if(user == null) {
        return notFound();
    } else {
        user.delete();
        return ok();
    }
}

当然,您可以构建更简单的查询,而不是使用关系加载整个对象 - 即,id仅获取字段:

User user = User.find.select("id").where().eq("id",id).findUnique();
于 2013-08-14T11:41:48.677 回答