休眠中的异常(不要更改对具有 cascade= "all-delete-orphan" 的集合的引用)



我在hibernate中遇到了一个奇怪的问题。我在我的项目中使用hibernate和spring。

问题是我有一个父子关系,当我试图更新父我得到异常

由:org.hibernate.HibernateException: Don't change reference to a collection with cascade="all-delete-orphan"引起

以下是映射:

父:

    <set name="kittens" fetch="join" lazy="false"
        inverse="true" cascade="all-delete-orphan">
        <key>
            <column name="ID" precision="22" scale="0"
                not-null="true" />
        </key>
        <one-to-many
            class="kitten" />
    </set>

孩子:

    <composite-id name="id" class="kittenId">
         <key-property name="kittenId" type="java.lang.Long">
            <column name="Kitten_ID" precision="22" scale="0" />
        </key-property>
       <key-many-to-one name="cat" class="cat">
            <column name="ID" precision="22" scale="0" />
        </key-many-to-one>                   
    </composite-id>

我在一个论坛上找到的,试着像

public void setKittens(Set kittens) {
    this.kittens.clear(); 
    this.kittens.addAll(kittens); 
} 

但现在我面对着

org.hibernate。PropertyAccessException:在小猫的setter内部发生异常

我也有同样的问题。在我的情况下,问题是,我错误地将update(Entinty e)称为save(Entity e)并得到此错误。

您应该区分调用setKittens()是为了替换集合的内容,而Hibernate调用setKittens()是为了初始化属性。我猜现在你得到NullPointerException在后一种情况下,因为this.kittensnull。如果是,你可以这样做:

public void setKittens(Set kittens) {
    if (this.kittens == null) {
        this.kittens = kittens;
    } else {
        this.kittens.clear();
        this.kittens.addAll(kittens); 
    }
} 

是否检查了变量小猫是否已实例化?也许它是空的,NullPointerException正在发生。您也可以尝试在setcats中调试。

我从来没有用hibernate处理xml,只使用注释。很抱歉我说了一些愚蠢的话

你应该考虑使用merge()而不是update();
并将"orphanRemoval = true"添加到一对多关系中,如下所示:

class IngredientMaterial{
    @OneToMany(mappedBy = "ingredientMaterial", fetch = FetchType.EAGER, cascade = CascadeType.ALL
         , orphanRemoval = true     //delete disassociated crowdSuggestion
    )
    private List<IngredientCrowdSuggestion> crowdSuggestions;
}

和使用

merge(ngredientMaterial);

最新更新