#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) в каждую задействованную сущность