我在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中发生异常
任何帮助将不胜感激。
答案 0 :(得分:5)
当您为了替换集合的内容而调用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);
}
}
答案 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);