2010-05-06 71 views
0

我有父母子女關係,其中家長有一個兒童的集合(一組是特定的)。子集合設置爲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; 
    } 
} 

回答

0

它可能來自Hibernate Bug

+0

在我的情況下,添加一個孩子只執行一個插入,但問題是,由於Spring的setTreatmentArms()調用,hibernate失去了對子組的引用,因此當它持續時,它簡單地重新插入它們全部。 例如,創建一個新的父項與一組子項(CH1,CH2)。保存時一切正常。但是,如果我通過刪除CH2(通過綁定到我的子集合的多選表單對象)來修改此集合並再次保留,則新子集現在是(CH1,CH2,CH1),它應該是(CH1) 。 – TimmyJ 2010-05-07 14:53:17