gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:28:12 24 4
gpt4 key购买 nike

我在使用 EnityManager 删除对象时遇到问题。我有像名字这样的参数。当我为用户添加此参数然后将其删除时,它工作正常。但EntityManager记住删除参数的id(Id是主键-自动增量)。当我再次为用户添加此参数时,EntityManager 会将行添加到数据库,但它保留第一个 persist() 的 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 -> 但在数据库中没有 id 的参数EM 知道。我不知道如何解决这个问题。我不知道 EM 在这种情况下应该如何工作? EM 应该在调用remove() 和flush() 后设置Id = null 吗?或者也许 persist() 和lush() 应该重新加载参数的Id?

谢谢

最佳答案

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

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

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

关于java - EntityManager 保留已删除对象的 id,并且在添加新对象后不会刷新 id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17021257/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com