org.hibernate.TransientObjectException如果任何多对一字段为空(或未在表单中选择)

时间:2014-12-15 13:16:30

标签: java hibernate jpa orm playframework

我正在使用jpa和play framework。我有一个实体JobseekerDetails

@Entity
public class JobseekerDetails {

    @Id
    @Column(name = "jobseekerDetails_id", nullable = false)
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long jobseekerDetails_id;

    @ManyToOne
    @JoinColumn(name = "basicEducation_id")
    private JobseekerFormBasicEducation basicEducation;

     @ManyToOne
    @JoinColumn(name = "masterEducation_id")
    private JobseekerFormMasterEducation masterEducation;

    @ManyToOne
    @JoinColumn(name = "doctrateEducation_id")
    private JobseekerFormDoctrateEducation doctrateEducation;

    @ElementCollection
    private List<String> certificateName =new ArrayList<String>();

    @Column(length = 3000)
    private String resume;

    private Long experience;

    private String skills;

    private String resumePath;

    @ManyToOne
    @JoinColumn(name = "industry_id")
    private JobseekerFormIndustry industry;

     @ManyToOne
    @JoinColumn(name = "functionalArea_id")
    private JobseekerFormFunctionalArea functionalArea;

}

JobseekerFormFunctionalArea JobseekerFormIndustry 等其他实体具有多对一关系。这些实体具有已保存在数据库中的固定值。

当保存JobseekerDetails时,其所有细节都应保存在相应的多个关系ID中,但不要保存到Entity JobseekerFormFunctionalArea和JobseekerFormIndustry,因为它们是预定义的

我的问题是,当我保存(通过我的表单)JobseekerDetails中的所有多个关系字段ID时,它被正确保存但是在提交我的表单时没有在任何多个关系字段中选择任何值如果我不选择任何东西在我的fuctionalArea_id字段,它给出了以下异常

org.hibernate.TransientObjectException:object references an unsaved transient instance - save the transient instance before flushing

如果我选择保存详细信息的所有字段,但是如果我选择任何在我的模型中映射多个字段的字段,那么它会给出以上异常

但是jpa自动设置nullable = true然后为什么会发生这种情况

我搜索了一下,发现这个问题可以通过添加级联来解决。我添加了 cacade type Merge ,但得到了相同的异常。

我也试过设置nullable = true但得到同样的错误

在设置 cascade = CascadeType.ALL cascade = CascadeType.PERSIST 时,我遇到异常

PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist:

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

如果您没有选择任何基础教育,那么

在表单中,您正在保存表单,然后有空ID的新对象。所以你有:

jobseekerDetails.basicEducation = new JobseekerFormBasicEducation ()

这会导致TransientObjectException

要避免它,你必须设置

jobseekerDetails.basicEducation=null 
保存前