Hibernate: обновленная информация о родительско-дочерних отношениях приводит к дублированию детей - PullRequest
0 голосов
/ 07 мая 2010

У меня есть родительские дочерние отношения, в которых родитель имеет коллекцию дочерних элементов (набор, который будет конкретным). Дочерняя коллекция настраивается с помощью 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;
    }
}

1 Ответ

0 голосов
/ 07 мая 2010

Это может происходить от гибернации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...