gpt4 book ai didi

java - 在将新子对象添加到父对象时,为所有子对象调用 JPA @PreUpdate

转载 作者:行者123 更新时间:2023-12-02 02:06:29 24 4
gpt4 key购买 nike

我的 parent 和 child 之间有一对多的关系。下面是关系的代码片段。

@Entity
@Table(name = "Parent")
public class Parent{

@OneToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
@Fetch(FetchMode.SELECT)
@JoinColumn(name = "parentId",referencedColumnName="parentId")
private Set<Child> child = new HashSet<>();
}

此外,在尝试保存和更新对象之前,我使用 @PreUpdate@PrePersist 对实体执行一些审核操作。

@PrePresist 看起来工作得很好。正如文档中提到的,在我尝试将新对象保留在数据存储中之前会调用它。

我在使用@PreUpdate时遇到问题。如果父级有多个子级,并且当我们尝试向其中添加另一个子级时entityManager.merge(parent)。当我们插入新的子记录时,@PrePresist 被正确调用,但它也为父级中已经存在的所有子记录调用 @PreUpdate 带注释的方法,尽管什么也没有任何子对象已更改。它不应该为所有子级调用 PreUpdate,因为其中没有任何更新。

有人知道为什么会发生这种情况吗?

提前致谢!

最佳答案

这实际上是设计使然。对所有子项调用 PreUpdate 的原因是,在这种情况下,hibernate 首先删除所有子项,然后重新插入它们。 http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#associations-one-to-many-unidirectional 中描述了此行为。 .

您遇到此问题是因为在本例中父级拥有该关联。这意味着当保存父项时,父项和子项之间的关联将在数据库中更新。除了删除所有子项并重新插入它们之外,没有其他办法可以做到这一点。

有人可能会提出一种解决方案,其中 hibernate 跟踪对集合所做的更改,并仅插入添加的记录并删除已删除的条目。虽然这似乎是一个解决方案,但如果数据库中的关联已更改,则它将不起作用。

问题的本质是,当客户端调用 parent.save 时,它期望在保存完成后,数据库将包含与 parent 关联的子项记录,这些记录位于调用 save 时的 children 集合。

如果 hibernate 仅跟踪添加和删除并仅执行这些操作,则以下情况将导致问题。

假设父级已经与两个子级关联:

Parent parent = new Parent();
parent.children(asSet(child1, child2));
parent.save();

然后两个客户端同时从数据库读取父状态。

客户端1:

Parent parent = dao.getParent(parentId);

客户端2:

Parent parent = dao.getParent(parentId);

第一个客户端添加一个子项并保存:

parent.children().add(child3);
parent.save();

到目前为止一切顺利。但第二个客户端仍然具有仅具有 child1child2 的父版本。例如,如果该客户端删除 child1 并保存:

parent.children().remove(child1);
parent.save();

它期望父级现在仅包含child2(因为这是保存时children集合包含的内容)。但是,如果我们使用跟踪实现,并且此类删除只会出现类似以下问题:

DELETE FROM child where parent_id = <parent_id> and id = <child1_id>

那么仍然会有两条记录与该父级关联 - child2child3

希望这是有道理的,并解释了为什么 hibernate 会删除所有子级并重新插入它们。

要解决您的问题,您需要使用 bidirectional OneToMany 关联,以便关联的子端对其进行管理。

关于java - 在将新子对象添加到父对象时,为所有子对象调用 JPA @PreUpdate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50708847/

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