和 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 侦听器移到您的业务逻辑中。
添加回答
举报
0/150
提交
取消