CascadeType.ВСЯ ошибка при использовании FetchType.НЕТЕРПЕЛИВЫЙ

#java #spring #hibernate #jpa #cascade

#java #весна #спящий режим #jpa #каскад

Вопрос:

У меня такая ситуация (с использованием SpringMVC hibernate):

Одна запись «Прайс-листа» создается одной «Службой» и одной «Компанией»:

Класс PriceList:

 //Many to one with Company
@NotNull(message = "....")  
@ManyToOne
@JoinColumn(name = "company_id", referencedColumnName="id", nullable=false) 
private Company company;


//Many to one with Service
@NotNull(message = "....")  
@ManyToOne
@JoinColumn(name = "service_id", referencedColumnName="id", nullable=false) 
private Service service;
 

Класс обслуживания:

 @OneToMany(mappedBy="service", cascade=CascadeType.ALL, fetch = FetchType.LAZY) 
private Set<PriceList> priceList;
 

Класс компании:

 @OneToMany(mappedBy="company", cascade=CascadeType.ALL, fetch = FetchType.LAZY) 
private Set<Company> company;
 

Моя проблема заключается в том, когда я пытаюсь УДАЛИТЬ прайс-лист:
без НЕТЕРПЕЛИВОГО все в порядке,
но с сохранением CascadeType.ВСЕ и FetchType .НЕТЕРПЕЛИВЫЙ я получаю эту ошибку:

org.springframework.web.util.NestedServletException: ошибка обработки запроса; вложенным исключением является org.springframework.dao.InvalidDataAccessApiUsageException: удаленный объект будет повторно сохранен каскадом (удаление удаленного объекта из ассоциаций): вложенным исключением является org.hibernate.Исключение ObjectDeletedException: удаленный объект будет повторно сохранен каскадом (удаление удаленного объекта из ассоциаций)

Я не понимаю, почему я получаю эту ошибку … я не думаю, что есть какие-либо проблемы, если я хочу удалить запись «Прайс-листа».

Я думаю, что я должен очистить или что-то в этом роде, прежде чем удалять свою запись…

Я удаляю компанию или услугу, все в порядке, потому что также удаляются записи в прайс-листе.

Большое вам спасибо за любое предложение

Комментарии:

1. Насколько я проверял, hibernate, похоже, не поддерживает FetchType стандартного jpa. удалите его и вместо этого используйте LazyCollection(FALSE)

2. Спасибо @maress, но, честно говоря, я не могу сказать, использую ли я JPA или спящий режим.. Я очень новичок в мире java / spring / hibernate и изо дня в день учусь создавать этот проект. кстати, я думаю, что нашел хорошее решение (ответ ниже): удалить объект из набора Company

Ответ №1:

Когда вы имеете дело с двунаправленными ассоциациями и хотите добавлять / удалять дочерние элементы, у вас должны быть эти методы в вашем родительском объекте:

 public void addChild(Child child) {
    children.add(child);
    child.setParent(this);
}

public void removeChild(Child child) {
    children.remove(child);
    child.setParent(null);
}
 

Удаление приведет к разрыву как родительских, так и дочерних / родительских ассоциаций.

Комментарии:

1. Спасибо. являются ли эти методы обязательными? (например, как getter и setter). я спрашиваю, потому что в учебнике, который я использовал для создания этого проекта, я никогда не видел этого

Ответ №2:

Я обнаружил, что перед удалением записи прайс-листа я должен удалить ее из коллекции прайс-листов в Company (потому что использование EAGER загружает в память весь прайс-лист):

 priceList_removing.getCompany().getPriceLists().remove(priceList_removing);

getCurrentSession().delete(priceList_removing);
 

Комментарии:

1. кстати, это может быть нормально для такого простого отношения, как это. но если я добавлю третье отношение к прайс-листу, например, Seller, когда мне нужно не забыть удалить прайс-лист из Company перед удалением продавца … я думаю, что это трудно иметь в виду и легко забыть поместить это remove(priceList_removing) в каждую задействованную сущность