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

问题描述 投票:0回答:2

这是我的删除方法:

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

..

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

java hibernate jpa
2个回答
0
投票

在删除实体之前,该实体必须是管理状态。我们可以使用一些函数mergefind等。注意:在EntityManager关闭后,它的所有实体都将被分离。

public void remove(Person p) {
    Perosn p2 = em.merge(p);
    em.remove(p2);
}

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));

我希望这个小例子能够解决你的问题。

© www.soinside.com 2019 - 2024. All rights reserved.