为了账号安全,请及时绑定邮箱和手机立即绑定

如果没有从父存储库显式刷新,则不会保留对父级的修改

如果没有从父存储库显式刷新,则不会保留对父级的修改

HUWWW 2021-09-12 20:16:41
和 spring-data-jpa 2.0.8.RELEASE我有一个@OneToMany相关的实体对。让我们说King& Peasant。我想要一个逻辑,当农民更新时,这也会@LastModifiedDate手动更新国王的值。我做这样的事情;@PreUpdate@PreRemove@PrePersistvoid updateParents() {    Date now = new Date();    BaseEntity container = getParent();    while (Objects.nonNull(container)) {        container.setUpdateDateTime(now);        container = container.getParent();    }}这很有效,这意味着它确实将所有父母更新到国王(表结构真的很混乱,从国王到最低的农奴有 5 个深度),我遇到的问题是,对父母的修改根本没有坚持. 我有如下服务;@Transactionalpublic void update(String kingId, String peasantSeqNo) {    Peasant peasant = peasantRepository.getPeasant(kingId, peasantSeqNo);    peasant.setNobility(false);    peasantRepository.save(peasant);}上面代码中,触发了@PreUpdate注解的updateParents()方法,更新了king的更新时间戳,仍然在事务结束后,这个变化没有持久化。我可以使用显式触发这种持久性,kingRepository.flush()但我希望它可以自动完成,只需修改父级即可。King-Peasant之间的联系如下;@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 的一个问题,但找不到确切的原因和解决方案,你能给我任何意见吗?
查看完整描述

1 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

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

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

这种行为实际上定义为未在 JPA 规范中定义:

通常,可移植应用程序的生命周期方法不应调用 EntityManager 或查询操作、访问其他实体实例或修改同一持久性上下文中的关系[46]。[47] 生命周期回调方法可以修改调用它的实体的非关系状态。

[46] 请注意,此警告也适用于可能注入实体侦听器的对象的操作。

[47] 此类操作的语义可能会在本规范的未来版本中标准化。

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


查看完整回答
反对 回复 2021-09-12
  • 1 回答
  • 0 关注
  • 127 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信