EntityManager保留已删除对象的id,并且在添加新对象后不刷新id

时间:2013-06-10 10:00:08

标签: java jpa entitymanager

我在使用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?

由于

1 个答案:

答案 0 :(得分:1)

我不建议转发对象。如果要保留新对象,则创建新对象并保留它,不要使用以前删除的实例。删除实例时,应该不再引用该实例,包括从您的应用程序引用它,因为该对象不再存在。

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

要确认您的错误,您删除同一个ID相同的两次相同的对象,并将其保留一次,第二次删除不起作用?什么不起作用,是否收到错误,或者没有生成SQL DELETE语句?您使用的JPA提供商和版本是什么?您可以尝试单独的交易,而不是相同的交易。