Hibernate中的异常(不要使用cascade =“all-delete-orphan”更改对集合的引用)

时间:2011-05-05 12:39:05

标签: hibernate spring

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

问题是我有父子关系,当我尝试更新父母时我得到了异常

引起:org.hibernate.HibernateException:不要使用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中发生异常

任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:5)

当您为了替换集合的内容而调用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); 
    }
} 

答案 1 :(得分:4)

我有同样的问题。在我的情况下问题是,我错误地而不是update(Entinty e)调用了save(Entity e)并且得到了这个错误。

答案 2 :(得分:0)

您是否检查过变量小猫是否已实例化? 也许它可以为null并且NullPointerException正在发生。 您也可以尝试在setKittens内部进行调试。

我从未将hibernate用于xml,只使用了注释。如果我说了些蠢话,那就很抱歉。

答案 3 :(得分:0)

你应该考虑使用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);