【发布时间】:2009-08-06 15:54:18
【问题描述】:
这是我的情况:我将一个包含双向父子关系的对象加载到我的数据库中。稍后,该对象被加载到我的 UI 中,可以在其中进行更改,包括从子集中删除任意数量的子集。然后使用 saveOrUpdate 方法加载我的对象的修改后的副本。但是,当保存此修改后的副本时,任何已删除的子项都保留在数据库中(将新子项添加到集合中可以正常工作)。在整个过程中没有抛出任何错误,但我需要将这些已删除的子项实际从数据库中删除。我在下面粘贴了我的 hibernate 和 java 代码的相关部分。
父休眠配置:
<bag name="specimenTypes" table="masterPkSpecimenType" cascade="all-delete-orphan" inverse="true">
<key column="runid"/>
<one-to-many class="SpecimenType"/>
</bag>
子休眠配置:
<many-to-one name="reportCriteriaBean" class="ReportCriteriaBean" column="runid" not-null="true" />
父对象代码:
public List<SpecimenType> getSpecimenTypes() {
return specimenTypes;
}
public void setSpecimenTypes(List<SpecimenType> specimenTypes) {
this.specimenTypes = specimenTypes;
if(this.specimenTypes != null){
for(SpecimenType specType : this.specimenTypes){
specType.setReportCriteriaBean(this);
}
}
}
子对象代码:
public ReportCriteriaBean getReportCriteriaBean() {
return reportCriteriaBean;
}
public void setReportCriteriaBean(ReportCriteriaBean reportCriteriaBean) {
this.reportCriteriaBean = reportCriteriaBean;
}
编辑:
显然我的问题是由于在我从数据库中检索父对象之后以及在我保存更新的对象之前显式调用 setSpecimenTypes() 所致。我这样做的原因是,由于某些动态 List 绑定,当它呈现给 UI 时,我需要 List 是 List 的特定实现(特别是 apache 的 LazyList)。但是,当从数据库中提取对象时,它并没有以这种方式实现,因此我创建了从数据库中提取的常规 List 的 LazyList 副本,并调用 setSpecimenTypes() 将其替换为我新填充的 LazyList。有谁知道我这样做的方法吗?
【问题讨论】:
标签: hibernate