У меня была проблема с 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 и два Увасек. Когда я загружаю и отсоединяю Ppv, удаляю один Uvazek, связанный с загруженным Ppv и слияние 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
на uvazek, установленном на отдельном Ppv. В предыдущей версии (< 4.1.8) это работает. В этом простом примере я могу восстановить его, добавив orphanRemoval=true
на uvazeks, установленный на Ppv, и вместо удаления uvazek удалите его из uvazeks, установленного на Ppv.
Итак, мой вопрос: это ошибка Hibernate или моя плохая практика?