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

时间:2019-03-22 23:34:56

标签: java hibernate jpa orm

我有一个使用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
            (?, ?, ?, ?, ?, ?)

但是当我只运行它时,它并没有保持表格干净。

在两种情况下,都将输出输出,但仅在调试时才有效。

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

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

1 个答案:

答案 0 :(得分:1)

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

尝试执行其他操作会导致未定义的行为。它可能会或可能不会起作用,并且它随时可能会中断。不要指望为什么您的特定案例也不起作用的权威性答案,因为尝试在侦听器中添加实体已经是一种黑客行为,并且不能保证能够正常工作。

您已被警告。