这是我的删除方法:
public void removeIletisimAdresi(Integer index){
getUser().getIletisimBilgileri().remove(getUser().getIletisimBilgileri().get(index))
}
这是我的父母关系
...
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, targetEntity= IletisimBilgileri.class, mappedBy = "user")
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private List<IletisimBilgileri> iletisimBilgileri = new ArrayList<IletisimBilgileri(0);
...
这是我的孩子:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "Kullanici")
private Users user ;
所以,如果我调用remove方法并更新像entityManager.merge(user)这样的父节点,它会抛出这样的异常:
引起:org.hibernate.ObjectDeletedException:传递给merge的已删除实例:[com.medikalborsasi.model.IletisimBilgileri#]
...
你能解释并帮助我如何解决这个问题?
答案 0 :(得分:0)
在删除实体之前,此实体必须是管理状态。我们可以使用一些函数merge
,find
等。注意:关闭EntityManager
后,其所有实体都将被分离。
public void remove(Person p) {
Perosn p2 = em.merge(p);
em.remove(p2);
}
答案 1 :(得分:0)
我认为问题只在你的代码中,
getUser().getIletisimBilgileri().remove(getUser().getIletisimBilgileri().get(index))
您的映射必须以这样的方式,即如果从hibernate中删除一个实体,则会导致从其他依赖实体中删除相同的实体。 例如:
Class A
{
/* List of B entity(child) */
List<B> listOfB;
}
Class B
{
/* reference of A(parent) */
A a;
}
所以如果你打电话
hibernateSession.delete(b);
应该从A中的列表中删除b的引用。 您不必从A中的List中显式删除B的引用。 所以根据你的方法,你正在做
getA().getListOfB.remove(getA().getListOfB().get(someIndex));
我希望这个小例子可以解决你的问题。