0

我在使用 EnitityManager 删除对象时遇到问题。我有像名字这样的参数。当我为用户添加此参数然后将其删除时,它工作正常。但是 EntityManager 记住已删除参数的 id(Id 是主键 - 自动增量)。当我再次为用户添加此参数时 - EntityManager 将行添加到数据库,但它保留第一个 persit() 的 id。因此,如果我再次删除参数值 - EM 不会删除参数 - 它会记住第一个参数的 id,因此没有具有此 id 的参数。

我的源代码是:

   if (!param.isParameterFilled()) {
        if (param.getId() != null) {
            param = getEmGap().merge(param);
            getEm().remove(param);
            getEm().flush();
        }
        return;
    }
    if (param.getId() == null) {
        getEm().persist(param);
    } else {
        getEm().merge(param);
    }
    getEm().flush();
}

也许问题与条件有关: if(param.getId() == null) - 在这种情况下(在第一次添加和删除之后) id != null - > 但在 DB 中没有 EM 知道的 id 参数。我不知道如何解决这个问题。而且我不知道在这种情况下EM应该如何工作?在调用 remove() 和 flush() 之后,EM 是否应该设置 Id = null。或者persist() 和flush() 应该重新加载参数的ID?

谢谢

4

1 回答 1

1

我不建议转世对象。如果要持久化一个新对象,然后创建一个新对象并将其持久化,请不要使用以前删除的实例。当您删除一个实例时,应该不再有对它的引用,包括从您的应用程序中,因为该对象不再存在。

此外,在同一事务中删除和保留具有相同 id 的对象通常不是一个好主意。如果可以,请尝试为每个新对象使用唯一的 ID。

为了确认您的错误,您将具有相同 id 的同一个对象与同一事务删除两次并持久化一次,第二次删除不起作用?什么不起作用,您是否收到错误,或者没有生成 SQL DELETE 语句?您使用的是什么 JPA 提供程序和版本?您可以尝试单独的交易,而不是相同的交易。

于 2013-06-10T13:36:31.220 回答