【问题标题】:Exception in Hibernate (Don't change the reference to a collection with cascade="all-delete-orphan")Hibernate 中的异常(不要更改对具有 cascade="all-delete-orphan" 的集合的引用)
【发布时间】:2011-05-05 12:39:05
【问题描述】:

我在休眠中遇到了一个奇怪的问题。我在我的项目中使用了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: 在 Kittens 的 setter 中发生异常

任何帮助将不胜感激。

【问题讨论】:

标签: hibernate spring


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您应该区分调用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。您可以考虑创建另一种方法来添加新的小猫。我不太喜欢自定义休眠设置器,它有时会导致一些意外行为,例如取决于休眠设置属性的顺序。
    【解决方案3】:

    你检查过变量 kittens 是否被实例化了吗? 也许它可以为 null 并且正在发生 NullPointerException。 你也可以尝试在 setKittens 中调试。

    我从来没有在 xml 中使用过 hibernate,只有注释。很抱歉,如果我说了一些愚蠢的话。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-25
        • 1970-01-01
        • 2011-08-01
        • 2013-06-11
        • 2012-03-14
        • 2018-03-06
        • 1970-01-01
        相关资源
        最近更新 更多