gpt4 book ai didi

java - 如果没有从父存储库中显式刷新,对父的修改不会持久

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

使用spring-data-jpa 2.0.8.RELEASE

我有一个 @OneToMany 相关实体对。假设国王农民。我想要一个逻辑,当更新农民时,这也会手动更新国王 @LastModifiedDate 值。我做了这样的事情;

@PreUpdate
@PreRemove
@PrePersist
void updateParents() {
Date now = new Date();
BaseEntity container = getParent();
while (Objects.nonNull(container)) {
container.setUpdateDateTime(now);
container = container.getParent();
}
}

这效果很好,这意味着它确实更新了所有 parent 到国王(表结构真的很困惑,从国王到最低农奴有 5 个深度),我遇到的问题是,对 parent 的修改不是坚持了下来。我有如下服务;

@Transactional
public void update(String kingId, String peasantSeqNo) {
Peasant peasant = peasantRepository.getPeasant(kingId, peasantSeqNo);
peasant.setNobility(false);
peasantRepository.save(peasant);
}

在上面的代码中,触发了@PreUpdate注解的updateParents()方法,并更新了king的更新时间戳,但在交易结束后,此更改并未持久化。我可以使用显式的 kingRepository.flush() 来触发这种持久性,但我希望它能够自动完成,只需修改父级即可。

王农之间的联系如下;

@JsonManagedReference
@OneToMany(mappedBy = "parent", cascade = REMOVE)
private List<Peasant> peasantry;

@JsonBackReference
@MapsId("kingId")
@ManyToOne(fetch = LAZY)
@JoinColumn(name = "ID_KING", referencedColumnName = "ID_KING", nullable = false)
private King parent;

这在某种程度上是我使用 JPA 的一个问题,但找不到确切的原因和解决方案,您能给我任何关于此问题的意见吗?

最佳答案

您遇到了 JPA(实现)的限制。

当事件被触发时,JPA 实现已经决定了它将保留哪些实体,因此您的更改不会被接受。

此行为实际上被定义为 JPA 规范中未定义的行为:

In general, the lifecycle method of a portable application should not invoke EntityMan- ager or query operations, access other entity instances, or modify relationships within the same persistence context[46].[47] A lifecycle callback method may modify the non-relationship state of the entity on which it is invoked.

[46] Note that this caution applies also to the actions of objects that might be injected into an entity listener.

[47] The semantics of such operations may be standardized in a future release of this specification.

因此,您需要将此行为从 JPA 监听器移至业务逻辑中。

关于java - 如果没有从父存储库中显式刷新,对父的修改不会持久,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52272436/

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