Jpa在将id设置为零后保持实体

时间:2015-10-14 17:42:06

标签: java hibernate jpa

我有以下三个实体

@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

我如何克服这种行为?

1 个答案:

答案 0 :(得分:1)

我将假设您正在使用JPA,因此使用的是javax.persistence.EntityManager实例。

我建议在更改ID并执行持久化之前分离对象。

例如,

entityManager.detach(instanceOfYourObjectHere);

发生的事情是Session正在对您的对象实例进行引用,并且在更改主键时会感到困惑。