我在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.kittens
是null
。如果是,你可以这样做:
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);