hibernate - 如何在休眠中使用 casedeType 一次保存父项和一组子项
问题描述
我有两个实体,即ExmStudentMarksEntry和ExmStudentMarksEntrySubcat
请看实体
家长ExmStudentMarksEntry
@Entity
@Table(name = "exm_student_marks_entry")
public class ExmStudentMarksEntry implements java.io.Serializable {
private Integer studentMarksId;
private String marks;
private Set<ExmStudentMarksEntrySubcat> exmStudentMarksEntrySubcats = new HashSet<ExmStudentMarksEntrySubcat>(0);
@OneToMany(fetch = FetchType.LAZY, mappedBy = "exmStudentMarksEntry",cascade=CascadeType.ALL)
public Set<ExmStudentMarksEntrySubcat> getExmStudentMarksEntrySubcats() {
return this.exmStudentMarksEntrySubcats;
}
public void setExmStudentMarksEntrySubcats(Set<ExmStudentMarksEntrySubcat> exmStudentMarksEntrySubcats) {
this.exmStudentMarksEntrySubcats = exmStudentMarksEntrySubcats;
}
}
和子实体ExmStudentMarksEntrySubcat
@Entity
@Table(name = "exm_student_marks_entry_subcat")
public class ExmStudentMarksEntrySubcat implements java.io.Serializable {
private Integer studentMarksSubcatId;
private ExmStudentMarksEntry exmStudentMarksEntry;
private String marks;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "student_marks_id", nullable = false)
public ExmStudentMarksEntry getExmStudentMarksEntry() {
return this.exmStudentMarksEntry;
}
public void setExmStudentMarksEntry(ExmStudentMarksEntry exmStudentMarksEntry) {
this.exmStudentMarksEntry = exmStudentMarksEntry;
}
}
我想使用休眠 CascadeType 保存父实体和子实体,所以我尝试将CascadeType.All提供给父类中的子实体,但它对我不起作用。
我将子对象设置为父对象并将其保存如下
@Override
public boolean addExamMarks(ExmStudentMarksEntry esm) {
// TODO Auto-generated method stub
boolean success = false;
try {
currentSession=sessionFactory.getCurrentSession();
currentSession.saveOrUpdate(esm);
success=true;
}
catch (Exception e) {
e.printStackTrace();
}
return success;
}
}
ints 只插入 parent 但不插入 childs 。给出以下异常
org.hibernate.PropertyValueException: not-null property references a null or transient value : com.rasvek.cg.entity.ExmStudentMarksEntrySubcat.exmStudentMarksEntry
请帮帮我。我怎样才能用hibernate实现这一点?
谢谢你。
解决方案
级联操作仅在更新或删除对象时发生,而不是在添加时发生。要添加,您必须手动设置对象。例如:
try {
currentSession=sessionFactory.getCurrentSession();
for(ExmStudentMarksEntrySubcat subcat : esm.getExmStudentMarksEntrySubcats()) {
subcat.setExmStudentMarksEntry(esm);
}
currentSession.saveOrUpdate(esm);
success=true;
}
推荐阅读
- reactjs - react native应用程序中重新渲染限制的dispatchAction错误
- spring-boot - 如何动态获取“id”来设置对象
- c - C - 线程中的 sleep() 会出现问题
- visual-studio - 发布成功但现场没有变化?
- python - 使用 Selenium 获取 BLOB url 时出错
- c# - 带参数的辅助对象的单个实例
- ios - 如何获取尺寸并加载 PDF 页面?
- r - 改变线性回归中虚拟变量输出的顺序
- python - 如何将多个字典组合成一个更高维度的字典?
- asp.net-core - Azure StorageAccount 中的 Blazor webAssembly 代码