org.hibernate.ObjectDeletedException:已将已删除的实例传递给merge

时间:2012-10-24 23:10:08

标签: java hibernate jpa

这是我的删除方法:

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#]

...

你能解释并帮助我如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

在删除实体之前,此实体必须是管理状态。我们可以使用一些函数mergefind等。注意:关闭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));

我希望这个小例子可以解决你的问题。