JPA Переводит В Спящий Режим Многих К Одному. Удалить Один

#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 машины.