我有以下三个实体
@Entity
class Session {
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval=true)
@JoinColumn(name="session_id", referencedColumnName="id")
private List<Testcase> testcases;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval=true)
@JoinColumn(name="session_id", referencedColumnName="id")
private List<SessionChart> sessionCharts;
}
@Entity
class SessionChart {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval=true)
@JoinColumn(name="sessionChart_id", referencedColumnName="id")
private List<ChartMeasurement> chartMeasurement;
}
@Entity
class ChartMeasurement {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@ManyToOne
@JoinColumn(name = "testcase_id", nullable=true, referencedColumnName = "id")
private Testcase testcase;
}
及其相应的getter和setter。创建一个新会话并将其保留在任何会话图表和图表测量中都很有效。但是当我可以从另一个用户打开以前保存的会话并重命名它(将所有者更改为我)并重新保存它从而创建新的数据库记录时,我有一个保存功能。我这样做是通过将id 0设置为实体及其所有子实体,即Testcases列出sessionCharts列表,并将所有chartMeasurement权限设置在sessionCharts列表中。但是当我试图坚持下去时,我得到以下错误
object references an unsaved transient instance - save the transient instance before flushing : ChartMeasurement.testcase -> Testcase
我如何克服这种行为?
答案 0 :(得分:1)
我将假设您正在使用JPA,因此使用的是javax.persistence.EntityManager实例。
我建议在更改ID并执行持久化之前分离对象。
例如,
entityManager.detach(instanceOfYourObjectHere);
发生的事情是Session正在对您的对象实例进行引用,并且在更改主键时会感到困惑。