在 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
并删除上述注释后,我的代码有效。
处理这种情况的正确方法是什么:
我有一个包含 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
并删除上述注释后,我的代码有效。