已调用预更新,但未存储子集合实体



我有一个使用 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!!!nnnnnn");
            events.add(WorkflowEvent.builder().workflow(workflow).step(this).eventType(WorkflowEventType.STEP_COMPLETED).build());
        }
        if (workflow.isCompleted()) {
            System.out.println("Event added!!!nnnnnn");
            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
            (?, ?, ?, ?, ?, ?)

但是当我只是运行它时,它没有,桌子保持干净。

在这两种情况下,都会打印输出,但仅在调试时打印输出。

已经检查了 PreUpdate 在添加到集合和类似帖子时不触发,但就我而言,该方法实际上是被调用的,只是它不存储任何内容。

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

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

尝试执行除此以外的任何操作都会导致未定义的行为。它可能会也可能不起作用,也可能随时会损坏。不要指望权威答案为什么你的具体情况也不起作用,因为尝试在侦听器中添加实体已经是一种黑客攻击,不能保证有效。

你已经被警告了。

最新更新