gpt4 book ai didi

java - 已调用 PreUpdate 但未存储子集合实体

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

我有一个使用 lombok 的 Spring 项目和一个这样定义的 JPA 带注释的类:

@EqualsAndHashCode
@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity(name = "workflow_step")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

@DiscriminatorColumn(name = "workflow_step_type")
@SuperBuilder
public abstract class BaseWorkflowStep extends BaseEntity {

@OneToMany(mappedBy = "step", cascade = CascadeType.PERSIST)
protected List<WorkflowEvent> events = Collections.synchronizedList(new ArrayList());

@PreUpdate
public void onPreUpdate() {
if (completed == true) {
System.out.println("Event added!!!\n\n\n\n\n\n");
events.add(WorkflowEvent.builder().workflow(workflow).step(this).eventType(WorkflowEventType.STEP_COMPLETED).build());
}
if (workflow.isCompleted()) {
System.out.println("Event added!!!\n\n\n\n\n\n");
events.add(WorkflowEvent.builder().workflow(workflow).step(this).eventType(WorkflowEventType.COMPLETED)
.build());
}
}

在我的测试中,总是调用 PreUpdate 方法,但由于某种原因,当我调试它时,它实际上会生成事件表的插入,如下所示:

Hibernate: 
/* insert eu.hnpgroup.icare.model.WorkflowEvent
*/ insert
into
workflow_event
(created, by_id, event_type, step_id, text, workflow_id)
values
(?, ?, ?, ?, ?, ?)

但是当我刚刚运行它时,它没有,并且 table 保持干净。

在这两种情况下,都会打印输出,但只有在调试时它才真正起作用。

已经检查过PreUpdate not firing when adding to a collection和类似的帖子,但就我而言,该方法实际上被调用,只是它不存储任何内容。

值得一提的是,我有另一个具有类似集合的实体,只是它将值存储在 prePersist 上并且按预期工作

最佳答案

请注意,根据 JPA 规范,您应该只使用实体监听器来修改实体的非关系状态。

尝试执行除此之外的任何操作都会导致未定义的行为。它可能起作用,也可能不起作用,也可能随时损坏。不要期待关于为什么您的具体情况不起作用的权威答案,因为尝试在监听器中添加实体已经是一种黑客行为,并且不能保证有效。

您已收到警告。

关于java - 已调用 PreUpdate 但未存储子集合实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55309086/

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