Исключение в Hibernate (не изменяйте ссылку на коллекцию с помощью cascade = "all-delete-orphan") - PullRequest
0 голосов
/ 05 мая 2011

У меня странная проблема в спящем режиме.Я использую 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>

Child:

    <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: исключение произошло внутрисеттер котят

Любая помощь будет оценена, пожалуйста.

Ответы [ 4 ]

5 голосов
/ 05 мая 2011

Следует различать ситуации, когда вы вызываете 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); 
    }
} 
4 голосов
/ 26 августа 2013

У меня была такая же проблема. В моем случае проблема заключалась в том, что я по ошибке вместо update(Entinty e) позвонил save(Entity e) и получил эту ошибку.

0 голосов
/ 20 октября 2017

вы должны рассмотреть возможность использования 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);
0 голосов
/ 05 мая 2011

Вы проверили, создан ли экземпляр котят?Может быть, оно может быть нулевым, и возникает NullPointerException.Вы также можете попробовать отладить внутри setKittens.

Я никогда не использовал hibernate с xml, только аннотации.Извините, если я сказал что-то глупое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...