我曾因爲Hibernate 4.1.8的問題導致以下異常:org.hibernate.ObjectNotFoundException:與給定的標識符的行存在
org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [test.hibernate.TestPrepravkaOsobaSAdresou$Uvazek#2]
我有兩個實體之間的簡單一對多關聯關係:
@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仍然有uvazek對分離的PPV集
org.hibernate.collection.internal.AbstractPersistentCollection.storedSnapshot
相關信息。在以前的版本(< 4.1.8)這個工程。在這個簡單的例子中,我可以通過在pvv上設置的uvazeks上添加orphanRemoval=true
來修復它,而不是刪除uvazek從pvv上設置的uvazeks中刪除它。
所以我的問題是:這是一個Hibernate錯誤還是我的壞習慣?
但爲什麼冬眠試圖合併Uvazek? uvazeks系列沒有合併級聯。是否因爲我嘗試合併Ppv,並且在uvazeks集合上有fetch = FetchType.EAGER?在這種情況下,我需要使用Ppv後,Hibernate需要使整個實體樹保持持久性?這只是一個例外。我只使用clear()作爲客戶端服務器通信的模擬。實際上它有點複雜。 – user3206615
一個救世主。我意外地在桌子上留下了空虛的價值。 – Saif