我有父母子女關係,其中家長有一個兒童的集合(一組是特定的)。子集合設置爲cascade =「all-delete-orphan」。當我最初保存父元素時,一切都按預期工作。但是,當我更新父母並再次保存時,所有孩子都會重新保存。休眠:更新父母 - 子女關係會導致重複的子女
這種行爲導致我相信父母正在失去對孩子集合的引用,因此當堅持所有孩子被重新保存時。看來解決這個問題的唯一方法是不使用這個子集合的setter方法,但不幸的是這個setter在我的應用程序中隱式調用(Spring MVC用於將多選表單元素綁定到這個集合,而setter在表單提交中由spring調用)。改寫此setter不能失去參考(即,做一個colleciton.clear()和collection.addAll(newCollection),而不是收集= newCollection)顯然是一個休眠的禁忌,如在此間指出,https://forum.hibernate.org/viewtopic.php?t=956859
有誰知道如何規避這個問題?我已經發布了一些我的代碼如下。
父hibernate配置:
<hibernate-mapping package="org.fstrf.masterpk.domain">
<class name="ReportCriteriaBean" table="masterPkReportCriteria">
<id name="id" column="id">
<generator class="org.hibernate.id.IncrementGenerator" />
</id>
<set name="treatmentArms" table="masterPkTreatmentArms"
sort="org.fstrf.masterpk.domain.RxCodeComparator" lazy="false" cascade="all-delete-orphan" inverse="true">
<key column="runid"/>
<one-to-many class="TreatmentArm"/>
</set>
</class>
</hibernate-mapping>
父對象:
public class ReportCriteriaBean{
private Integer id;
private Set<TreatmentArm> treatmentArms;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Set<TreatmentArm> getTreatmentArms() {
return treatmentArms;
}
public void setTreatmentArms(Set<TreatmentArm> treatmentArms) {
this.treatmentArms = treatmentArms;
if(this.treatmentArms != null){
for(TreatmentArm treatmentArm : this.treatmentArms){
treatmentArm.setReportCriteriaBean(this);
}
}
}
孩子冬眠配置:
<hibernate-mapping package="org.fstrf.masterpk.domain">
<class name="TreatmentArm" table="masterPkTreatmentArms">
<id name="id" column="id">
<generator class="org.hibernate.id.IncrementGenerator" />
</id>
<many-to-one name="reportCriteriaBean" class="ReportCriteriaBean" column="runId" not-null="true" />
<property name="rxCode" column="rxCode" not-null="true"/>
</class>
</hibernate-mapping>
的子對象:
public class TreatmentArm {
private Integer id;
private ReportCriteriaBean reportCriteriaBean;
private String rxCode;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public ReportCriteriaBean getReportCriteriaBean() {
return reportCriteriaBean;
}
public void setReportCriteriaBean(ReportCriteriaBean reportCriteriaBean) {
this.reportCriteriaBean = reportCriteriaBean;
}
public String getRxCode() {
return rxCode;
}
public void setRxCode(String rxCode) {
this.rxCode = rxCode;
}
}
在我的情況下,添加一個孩子只執行一個插入,但問題是,由於Spring的setTreatmentArms()調用,hibernate失去了對子組的引用,因此當它持續時,它簡單地重新插入它們全部。 例如,創建一個新的父項與一組子項(CH1,CH2)。保存時一切正常。但是,如果我通過刪除CH2(通過綁定到我的子集合的多選表單對象)來修改此集合並再次保留,則新子集現在是(CH1,CH2,CH1),它應該是(CH1) 。 – TimmyJ 2010-05-07 14:53:17