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

和 spring-data-jpa 2.0.8.RELEASE


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


@PreUpdate

@PreRemove

@PrePersist

void updateParents() {

    Date now = new Date();

    BaseEntity container = getParent();

    while (Objects.nonNull(container)) {

        container.setUpdateDateTime(now);

        container = container.getParent();

    }

}

这很有效,这意味着它确实将所有父母更新到国王(表结构真的很混乱,从国王到最低的农奴有 5 个深度),我遇到的问题是,对父母的修改根本没有坚持. 我有如下服务;


@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()但我希望它可以自动完成,只需修改父级即可。


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 的一个问题,但找不到确切的原因和解决方案,你能给我任何意见吗?


HUWWW
浏览 133回答 1
1回答

幕布斯6054654

您遇到了 JPA(实现)的限制。当事件被触发时,JPA 实现已经决定它将保留哪些实体,因此您的更改不会被接受。这种行为实际上定义为未在 JPA 规范中定义:通常,可移植应用程序的生命周期方法不应调用 EntityManager 或查询操作、访问其他实体实例或修改同一持久性上下文中的关系[46]。[47]&nbsp;生命周期回调方法可以修改调用它的实体的非关系状态。[46] 请注意,此警告也适用于可能注入实体侦听器的对象的操作。[47] 此类操作的语义可能会在本规范的未来版本中标准化。因此,您需要将此行为从 JPA 侦听器移到您的业务逻辑中。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java