gpt4 book ai didi

java - org.hibernate.ObjectNotFoundException :No row with the given identifier exists

转载 作者:IT老高 更新时间:2023-10-28 13:46:19 27 4
gpt4 key购买 nike

自 Hibernate 4.1.8 以来我遇到了一个问题,导致以下异常:

org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [test.hibernate.TestPrepravkaOsobaSAdresou$Uvazek#2]

我在两个实体之间有一个简单的 OneToMany 关联:

@Entity(name = "Ppv")
@Table(name = "PPV")
public static class Ppv {

@Id
Long ppvId;

@OneToMany(fetch = FetchType.EAGER, mappedBy = "ppv")
Set<Uvazek> uvazeks = new HashSet<Uvazek>(0);
}


@Entity(name = "Uvazek")
@Table(name = "UVAZEK")
public static class Uvazek {

@Id
Long uvazekId;

@ManyToOne
@JoinColumn(name = "PPV_FXID")
Ppv ppv;

}

还有一个测试用例,其中我有一个 Ppv 和两个 Uvazek。当我加载和分离一个 Ppv 时,删除一个与加载的 Ppv 关联的 Uvazek 并合并 Ppv 我得到一个异常。

jdbcTemplate.execute("insert into PPV values(1)");
jdbcTemplate.execute("insert into UVAZEK values(2, 1)");
jdbcTemplate.execute("insert into UVAZEK values(3, 1)");

Ppv ppv = (Ppv) getSession().get(Ppv.class, 1l);
getSession().clear();

getSession().delete(getSession().get(Uvazek.class, 2l));
getSession().flush();
getSession().merge(ppv);
getSession().flush(); //Causes the exception

在 Ppv 合并期间,Hibernate 尝试加载已删除的 Uvazek。即使 Uvazek 被删除,Hibernate 中仍然有关于它的信息

org.hibernate.collection.internal.AbstractPersistentCollection.storedSnapshot

在分离 Ppv 上的 uvazek 设置上。在以前的版本(<4.1.8)中,这是可行的。在这个简单的示例中,我可以通过在 Ppv 上设置的 uvazeks 上添加 orphanRemoval=true 来修复它,而不是从 Ppv 上设置的 uvazeks 中删除 uvazek。

所以我的问题是:这是 Hibernate 错误还是我的不良做法?

最佳答案

问题是试图合并 id = 2 的 Uvazek。 Hibernate 看到它有一个键,但它不知道对象是否脏,所以不清楚是否应该进行 SQL 更新。

但是因为key是2,所以Hibernate知道该对象必须存在于数据库中,所以它会尝试加载该对象,以便将它与它刚刚在内存中接收到的版本进行比较,看看该对象是否有一些待修改以同步到数据库。

但是 select 没有返回结果,所以 Hibernate 有矛盾的信息:一方面数据库说对象不存在。另一方面,内存中的对象表示该对象必须以键 2 存在。无法确定哪个是正确的,因此抛出 ObjectNotFoundException

发生的情况是,在这个版本之前,代码意外地基于一个同时得到修复的错误,所以这不再有效。

最佳做法是避免清除,仅在需要时将其用作内存优化,通过仅清除您知道不会在同一 session 中修改或不再需要的对象,查看 Is Session clear() considered harmful .

关于java - org.hibernate.ObjectNotFoundException :No row with the given identifier exists,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21186366/

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