首页 > 解决方案 > 如何在休眠中使用 casedeType 一次保存父项和一组子项

问题描述

我有两个实体,即ExmStudentMarksEntryExmStudentMarksEntrySubcat

请看实体

家长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实现这一点?

谢谢你。

标签: hibernate

解决方案


级联操作仅在更新或删除对象时发生,而不是在添加时发生。要添加,您必须手动设置对象。例如:

try {
    currentSession=sessionFactory.getCurrentSession();
    for(ExmStudentMarksEntrySubcat subcat : esm.getExmStudentMarksEntrySubcats()) {
        subcat.setExmStudentMarksEntry(esm);
    }
    currentSession.saveOrUpdate(esm);     
    success=true;     
}

推荐阅读