Представьте себе сценарий, подобный:
CREATE TABLE PARENT (id BIGINT, name VARCHAR);
и
CREATE TABLE CHILD (id BIGINT, name VARCHAR, parent_id BIGINT FOREIGN KEY REFERENCES PARENT(id));
Это, переведенное в сущности JPA, будет выглядеть примерно так:
Parent.java:
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "parent", orphanRemoval = true)
private List<Child> child;
Child.java:
@ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.MERGE, CascadeType.PERSIST}) //Child should not modify parent (except for its List<> of childs)
@JoinColumn(name = "parentId", updatable = false, insertable = false)
private Parent parent;
Я не знаю, как выполнить следующий параметр:
- Когда parentRepository.saveOrMerge (parent) имеет значениевыполняется, и родитель и его дочерний элемент должны быть сохранены.Если дочерний Set родительского объекта был обновлен из состояния db, изменения должны быть применены и к дочерней таблице.(Это флаг orphanRemoval, я думаю).Если состояние конкретного дочернего элемента изменилось, его также следует сохранить (это CascadeType.ALL на родительской стороне, я думаю).
Когда parentRepository.remove (parent) имеет значениевыполнено, родитель и его дочерний элемент должны быть удалены.Как и в случае ON DELETE CASCADE, все, что ссылается на parent, должно быть удалено, даже если у управляемого объекта был очищен дочерний набор.Я не знаю, возможно ли это через JPA.
Когда выполняется childRepository.saveOrMerge (child), child должен быть сохранен, а если родительский объект не сохранен, он должен быть сохранентакже.Если родитель находится в db, а у потомка есть измененный экземпляр, изменения следует отменить.(Полагаю, это флаги updatable = false и inserttable = true)
Когда выполняется childRepository.remove (child), child должен быть удален из db, И из любого набора родителей вобъем памяти.Если это был единственный дочерний элемент, который был у родителя, родитель не должен быть удален (я полагаю, это упущение CascadeType.REMOVE в отношении дочерней стороны)
В настоящее время с предыдущим кодомпункт № 4 недостижим.Могу ли я в любом случае указать, что дочерний набор родителя должен автоматически обновляться, если я childRepository.remove (child) только с помощью аннотаций JPA в сущности?Я хотел бы избежать использования parentRepository, когда я хочу удалить ребенка.Я нахожу неестественным единственный способ добиться всего этого, удалив моего ребенка из родительского набора и сохранив родителя.Какой смысл в ChildRepository, если обновления Set в родительском элементе и сохранения родительского достаточно для всего?