Я думал, что до недавнего времени я лучше разбирался в Spring Data JPA (удаляет).Весенние данные Удаление JPA не то, что я ожидал
Во всяком случае, у меня есть два класса с OneToMany
и ManyToOne
отношения:
@Entity
@Table(name = "COMPANIES")
public class Company implements Serializable {
...
@OneToMany(mappedBy = "company",
fetch = FetchType.EAGER,
orphanRemoval = true,
cascade = CascadeType.ALL)
private Set<Commodity> commodities = new HashSet<>();
}
....
@Entity
@Table(name = "COMMODITIES")
public class Commodity implements Serializable {
...
@ManyToOne(optional = false)
@JoinColumn(name = "COMPANY_ID", referencedColumnName = "ID", nullable = false)
private Company company;
}
Я хочу, чтобы удалить Commodity
запись поэтому у меня есть это в моем слое службы:
@Transactional
public void delete(Commodity commodity) {
repo.delete(commodity);
}
Когда я запустить код, он выполняет все SELECT, но на самом деле никогда не выполняет удаление. Нет сообщений об ошибках ... не удалять в журналах и т.д.
Так я обнаружил, что есть два варианта:
1) Снимите CascadeType.ALL
2) Измените мой метод удаления для:
@Transactional
public void delete(Commodity commodity) {
Company company = commodity.getCompany();
company.getCommodities().remove(commodity);
companyRepo.save(company);
}
3) Напишите собственный метод @Query для выполнения удаления (а не).
Мое понимание каскадирования заключалось в том, что если бы мы должны были удалить основную запись, например, Company, то все ее дочерние объекты будут автоматически удалены. Это имеет смысл для меня.
Итак, мой вопрос: почему этот CascadeType препятствует ручному удалению дочерней записи?
Благодаря
EDIT
Я не очень ясно. Использование опции 1 или опции 2 выше выполняет удаление.
См. Следующее, хотя кажется, что поведение, возможно, изменилось, если исключить исключение, чтобы ничего не делать. Самый верный ответ - это ваше решение (2), которое является лучшим решением независимо от того, как вы гарантируете, что ваша модель в памяти остается совместимой с базой данных, что не соответствует вашему оригинальному решению. http://stackoverflow.com/questions/11649249/deleted-object-would-be-re-saved-by-cascade-remove-deleted-object-from-associat –