gpt4 book ai didi

java - Hibernate级联删除不起作用

转载 作者:行者123 更新时间:2023-11-30 06:46:34 24 4
gpt4 key购买 nike

我有 3 个实体:“Person”、“Document”、“PersonDocument”,其相关关系如下:

class Person {
@Cascade(CascadeType.ALL)
@OneToMany(mappedBy = "person", orphanRemoval = true, fetch = FetchType.LAZY)
Set<PersonDocument> personDocuments;
}

class Document {
@OneToMany(mappedBy = "document")
Set<PersonDocument> personDocuments;
}

@IdClass(PersonDocumentPK.class)
public class PersonDocument {
@Id
private Person person;
@Id
private Document document;

@ManyToOne(fetch = FetchType.LAZY)
private Provider provider;
}

public class PersonDocumentPK implements Serializable {

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "person_guid")
private Person person;

@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "documents_guid")
private Document document;
}

在我的代码中,我尝试从 Person#personDocuments 中删除一些记录并添加新记录。我这样做是这样的:

Iterator it = person.getPersonDocuments().iterator();
PersonDocument pd = it.next();
if (some logic) it.remove();
...
person.getPersonDocuments().addAll(new set of values);

结果删除后,personDocuments 已经消失,但相关文档仍保留在数据库中。为什么会这样?

最佳答案

级联操作不是这样工作的。

当您使用@Cascade注释时,在父级中进行的操作将根据级联类型级联到子级关联。

由于您的类使用 CascadeType.ALL 进行注释,因此在父类中进行的所有操作都会级联到子类。

因此,为了使删除工作正常进行,您需要调用 entityManager.remove(person),然后持久性提供程序也会在子级中调用删除操作。

话虽这么说,请将您的代码更改为类似的内容:

Iterator it = person.getPersonDocuments().iterator();
PersonDocument pd = it.next();
if (some logic) {
it.remove();
em.remove(pd); // No problem to call in the loop because it will call the database only on commit or flush
}
...

person.getPersonDocuments().addAll(new set of values);

关于java - Hibernate级联删除不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43587625/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com