#jpa #many-to-many #one-to-many
Вопрос:
У меня одно освобождение, много к одному. У многих автомобилей один владелец. Как удалить владельца только в том случае, если все его автомобили удалены?
У бывшего одного владельца две машины. 1)удалите первый автомобиль, с владельцем ничего не случится. удалить второго владельца автомобиля удалить.(Может быть достигнуто с помощью orphanremoval=true?) 2) удалите владельца, удалите весь его автомобиль. (Может быть достигнуто с помощью CascadeType.Удалить ?)
class Car{
@ManyToOne(orphanremoval=true)
private Owner owner;
}
class Owner{
@OneToMany(cascade= CascadeType.REMOVE)
private List<Car> cars;
}
Комментарии:
1. Удаление сирот должно сработать. Разве ты не пробовал этого?
2. Мне интересно, хороший ли подход к дизайну
3.
@ManyToOne
не имеетorphanRemoval
атрибута ( ref ) — если бы он был, я не понимаю, почему это был бы плохой подход. В этом случае у вас, вероятно, нет другого выбора, кроме как делать то, что вы хотите в коде. Следите за проблемами параллелизма (пример: у владельца осталось 2 автомобиля, поступают 2 одновременных запроса на удаление каждого из них; при наивной реализации каждая одновременная транзакция учитывает оставшиеся автомобили как 1, поэтому не удаляет владельца!!!)4. спасибо вам за ваш ответ. поэтому в первом примере с автомобилем и частным владельцем я должен использовать вместо orphanremoval CascadeType.Remove. Так что в бд у меня будет car1=> Владелец car2=>> Владелец. с помощью cascadetype.удалить. если владелец автомобиля 1deleted также будет удален. Это причина проблемы во втором ряду? ( car2=>Владелец).
5. Я все еще не понимаю, как удалить владельца, только если удалить обе 2 машины.