У меня есть родительские дочерние отношения, в которых родитель имеет коллекцию дочерних элементов (набор, который будет конкретным). Дочерняя коллекция настраивается с помощью cascade = "all-delete-orphan". Когда я изначально сохраняю родительский элемент, все работает как положено. Однако, когда я обновляю родителя и сохраняю снова, все дочерние элементы восстанавливаются.
Такое поведение заставляет меня верить, что родитель теряет свою ссылку на коллекцию детей, и поэтому при сохранении все дети повторно сохраняются. Кажется, единственный способ исправить это - не использовать метод setter этой дочерней коллекции, но, к сожалению, этот setter неявно вызывается в моем приложении (Spring MVC используется для привязки элемента формы с множественным выбором к этой коллекции, и setter называется весной по форме подачи). Перезапись этого установщика, чтобы не потерять ссылку (т. Е. Сделать colleciton.clear () и collection.addAll (newCollection), а не collection = newCollection), по-видимому, является гибернацией "нет-нет", как указано здесь: https://forum.hibernate.org/viewtopic.php?t=956859
Кто-нибудь знает, как обойти эту проблему? Я разместил часть своего кода ниже.
Конфигурация родительского спящего режима:
<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;
}
}