Как видите, я использую мягкое/логическое удаление в своей системе:
Мои сущности:
@Where(clause = "deleted='false'")
public class Person {
//...
}
Мои услуги:
@Override
public ServiceResponse DeletePerson (Person entity) {
ServiceResponse sr = new ServiceResponse<>();
try {
sr = ValidateDeletePerson(entity); //Business logic treatment
if (sr.hasError())
return sr;
Person dbEntity = GetPerson(entity.getPersonID());
dbEntity.setDeleted(true);
_repository.save(dbEntity);
} catch (Exception ex) {
sr.getErrors().add(new ServiceError(ex));
}
return sr;
}
Когда пользователь пытается удалить объект — на самом деле только логическое значение deleted переключается на true в БД, как показано выше, — я хочу проверить, объект ссылается на другой перед выполнением этого логического удаления.
Итак, если объект используется/ссылается другим, я хочу поймать это действие как ошибку или другое подобное лечение, чтобы предотвратить удаление.
Например, если Person with ID 5
прикреплен к Student
, пользователь не может удалить этого человека.
Каковы лучшие методы предотвращения этого?
Важное РЕДАКТИРОВАТЬ:
1) Person упоминается в N таблицах, а не только в Student, поэтому я изучаю общий способ добиться этого (может быть, вы можете сказать hibernate проверить это?)
2) Идея состоит в том, чтобы сделать это программно, избегая модификаций БД.
deleted
равнымtrue
. Из всех альтернатив это решение может иметь ощутимое снижение производительности, но оно также зависит от модели данных. - person crizzis   schedule 25.04.2018