Как сохранить объекты с двунаправленными отношениями со стороны, не владеющей им? - PullRequest
1 голос
/ 29 мая 2020

Как лучше всего представить приведенные ниже таблицы с двунаправленной связью, где nodes - сторона-владелец, использующая Spring Data / JPA? Я хочу сохранить nodes с помощью node_node и сохранить node_node.

узлов таблица

  • id

node_node таблица

  • node_id_1

  • node_id_2

Вот что у меня есть на данный момент. Двунаправленная связь, при которой NodeNode является стороной-владельцем, что означает, что когда я создаю, обновляю или удаляю элемент в parents или children из Node, он не сохраняется. Когда я обновляю Node, добавляя к parent или children, кажется, что он работает, но когда я обновляю путем удаления, он не работает. Мне нужно сохранить через NodeNode, так как это сторона-владелец, но это слишком хлопотно, так как для этого потребуется сохранение до Node и NodeNode.

public class Node {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @OneToMany(mappedBy = "parent", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
    private Set<NodeNode> parents;

    @OneToMany(mappedBy = "child", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
    private Set<NodeNode> children;

}

public class NodeNode {

    @ManyToOne
    @JoinColumn(name = "node_id_1")
    private Node parent;

    @ManyToOne
    @JoinColumn(name = "node_id_2")
    private Node child;

}

Цель - чтобы иметь возможность сохранить Node с любыми изменениями в Node.parents или Node.children, а также NodeNode.

1 Ответ

0 голосов
/ 04 июня 2020

Лучшим решением было заменить OneToMany и ManyToOne отношениями ManyToMany и использовать Node вместо ссылки на NodeNode.

@ManyToMany(fetch = FetchType.EAGER, cascade = { CascadeType.MERGE, CascadeType.REFRESH,  CascadeType.DETACH })
@JoinTable(name = "node_node", joinColumns = @JoinColumn(name = "node_id_1"), inverseJoinColumns = @JoinColumn(name = "node_id_2"))
private Set<Node> children;

@ManyToMany(fetch = FetchType.EAGER, mappedBy = "children")
private Set<Node> parents;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...