Отношение ManyToOne, родитель может обновлять / удалять / добавлять дочерние элементы, но список родителей также обновляется при сохранении / удалении дочерних элементов без каскадирования - PullRequest
0 голосов
/ 21 ноября 2018

Представьте себе сценарий, подобный:

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 в родительском элементе и сохранения родительского достаточно для всего?

...