В настоящее время я использую следующие объекты:
Вот родительский объект:
@Table(name = "parent_table")
public class Parent {
@Id
@GeneratedValue
private int id;
private String name;
@OneToMany(mappedBy = "parent")
private Set<Child> children = null;
}
Вот дочерний объект
@Table(name = "child_table")
public class Child {
@Id
@GeneratedValue
private int id;
private String value;
@ManyToOne
@JoinColumn(name = "parent_id", nullable = false)
private Parent parent;
}
Недавно кто-то с Права на удаление сделали жесткое удаление родительской записи в таблице базы данных без удаления дочерней записи в дочерней таблице. Это вызвало 500 исключений в ответе. (В настоящее время правила целостности не используются на уровне базы данных).
Хотя человек никогда не должен выполнять полное удаление, это не должно разрушать нашу систему.
Вот упрощенный код, который завершается ошибкой, когда родительская строка удаляется из родительской таблицы, но дочерние строки не удаляются:
private Predicate buildPredicate(Root<Child> root, CriteriaQuery<Child> query, CriteriaBuilder cb, String value) {
List<Predicate> predicates = new ArrayList<>();
predicates.add(cb.equal(root.get("value"), value));
// ... additional predicate.add calls which I have removed for this example
return cb.and(predicates.toArray(new Predicate[0]));
}
public List<Parent> getParents(String value) throws RedirectsServiceException {
try {
List<Child> children = childRepository.findAll((root, query, cb) -> buildPredicate(root, query, cb, value));
return children.stream().map(Child::getParent).distinct().collect(Collectors.toList());
} catch (Exception e) {
throw new MyException(e.getMessage() + " while executing getParents", e);
}
}
Вот ошибка, которую я вижу, если кто-то удаляет строку в родительской таблице.
javax.persistence.EntityNotFoundException: Unable to find com.path.Parent with id 618 while executing getParents
В идеале я хотел бы игнорировать записи Child, в которых отсутствует родитель. Я хотел бы, чтобы не было никаких исключений, и включал бы ТОЛЬКО дочерние записи, которые имеют значение, но не пропускают родительскую запись.
Должен ли я использовать, существует? Должен ли я использовать подзапрос? Какой прямой способ справиться с этим?