在 Spring Webflow 中保存 JPA 实体的正确方法:传递给持久化的分离实体

Correct way of saving JPA entities in Spring Webflow: detached entity passed to persist

处理这种情况的正确方法是什么:

我有一个包含 4 个步骤的流程,每个步骤都映射到其实体 class 并连接到一个父实体(ParentEntity 通过一对一关系连接到每个 StepNEntity)。进行下一步时,当前步骤将保存到数据库中。

@Entity
public class ParentEntity {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "id", nullable = false)
  private Integer id;

  @OneToOne(mappedBy = "parentEntity")
  private Step1 step1;

  @OneToOne(mappedBy = "parentEntity")
  private Step2 step2;

  ...
}

@Entity
public class Step1 {

  @MapsId
  @OneToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "parent_id")
  private ParentEntity parentEntity;

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "id", nullable = false)
  private Integer id;

  ...
}

@Entity
public class Step2 {

  @MapsId
  @OneToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "parent_id")
  private ParentEntity parentEntity;

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "id", nullable = false)
  private Integer id;

  ...
}

我使用 repository.save() 将 Step1 的 ParentEntity 保存到 DB 没有问题。在我尝试的第二步

parentEntity.setStep2(step2); // step2 is a model in my flow view
parentRepository.save(parentEntity); // produces org.hibernate.PersistentObjectException: detached entity passed to persist:

同样,如果我尝试

step2.setParentEntity(parentEntity);
step2Repository.save(step2);

我的问题出在我错误添加的注释 @MapsId 中。手动设置 ParentEntity 并删除上述注释后,我的代码有效。