0

这是我的删除方法:

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:已删除实例传递给合并:[com.medikalborsasi.model.IletisimBilgileri#]

..

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

4

2 回答 2

2

我认为问题仅在您的代码中,

getUser().getIletisimBilgileri().remove(getUser().getIletisimBilgileri().get(index))

您的映射必须采用这样一种方式,即如果您从休眠状态中删除一个实体,则会导致从其他依赖实体中删除相同的实体。例如:

Class A
{
     /* List of B entity(child) */
     List<B> listOfB;

}

Class B
{
     /* reference of A(parent) */
     A a;
}

所以如果你打电话

hibernateSession.delete(b);

应该从 A 中的列表中删除 b 的引用。您不必从 A 中的列表中显式删除 B 的引用。因此,按照您正在执行的方法

getA().getListOfB.remove(getA().getListOfB().get(someIndex));

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

于 2012-10-25T10:58:21.007 回答
-1

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

public void remove(Person p) {
    Perosn p2 = em.merge(p);
    em.remove(p2);
}
于 2012-10-25T10:16:05.300 回答