Java org.hibernate.TransientObjectException如果任何多对一字段为空(或未在表单中选择)
我正在使用jpa和play框架。我有一个实体JobseekerDetailsJava org.hibernate.TransientObjectException如果任何多对一字段为空(或未在表单中选择),java,hibernate,jpa,orm,playframework,Java,Hibernate,Jpa,Orm,Playframework,我正在使用jpa和play框架。我有一个实体JobseekerDetails @Entity public class JobseekerDetails { @Id @Column(name = "jobseekerDetails_id", nullable = false) @GeneratedValue(strategy = GenerationType.AUTO) private Long jobseekerDetails_id; @ManyTo
@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;
}
如果我选择了所有字段,详细信息将被保存,但是如果我不能选择在我的模型中映射了多个字段的任何字段,则会出现上述异常
org.hibernate.TransientObjectException:object references an unsaved transient instance - save the transient instance before flushing
PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist:
但jpa会自动将null设置为true,那么为什么会发生这种情况
我搜索了一下,发现这个问题可以通过添加cascade来解决。我添加了cacade类型Merge,但得到了上述相同的异常
我还尝试设置nullable=true,但得到了相同的错误
在设置cascade=CascadeType.ALL和cascade=CascadeType.PERSIST时,我得到以下异常
org.hibernate.TransientObjectException:object references an unsaved transient instance - save the transient instance before flushing
PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist:
如果您没有在表单中选择任何“基本教育”,并且您正在保存表单,则会有一个id为空的新对象。因此,您有:
jobseekerDetails.basicEducation = new JobseekerFormBasicEducation ()
这会导致TransientObject异常
要避免它,你必须设置
jobseekerDetails.basicEducation=null
保存前。请参见上面我的编辑,在添加cascade type all时出现异常,而且cascade type all(如我所知)将尝试将数据保存在我相应的多通映射表中,我不希望出现问题中所述的情况。如果我错了,请更正