Я хочу создать организационную структуру с использованием JPA.Если я вставлю данные с помощью моего контроллера, он выдаст исключение PSQLEx, потому что родительский узел первого узла является нулевым.Но если я ввожу первый узел вручную в БД, он работает для следующего узла.Я читал о этой и других публикациях, но мне не повезло.
Это моя сущность:
@Entity
@Table(name = "tree")
public class Node implements Serializable {
@Id
private int id;
private String name;
@OneToMany(
cascade = CascadeType.ALL
)
@JoinColumn(name = "parent_id", nullable = true)
@OrderColumn
@JsonManagedReference
private Set<Node> children = new HashSet<>();
@Basic(optional = true)
@ManyToOne(
fetch = FetchType.LAZY,
optional = true
)
@JoinColumn(name = "parent_id", nullable = true)
@JsonBackReference
private Node parent;
public void addNode(Node node){
this.getParent().getChildren().add(node);
node.setParent(this.getParent());
}
// Getter setter was removed for brevity
}
Это мой контроллер:
@RestController
@RequestMapping("/node")
public class NodeController {
@Autowired
private NodeRepository nodeRepository;
@GetMapping
public @ResponseBody Iterable<Node> index(){
return nodeRepository.findByParentIsNull();
}
@PostMapping
public String add(
@RequestBody List<Node> nodes){
nodes.stream().forEach(
node -> {
node.addNode(node);
}
);
nodeRepository.saveAll(nodes);
return "nice";
}
}
И это мой пример данных:
[
{
"id":8,
"name":"Top Parent",
"parent":{}
},{
"id":9,
"name":"Node 1",
"parent":{
"id":8
}
},{
"id":10,
"name":"Node 2",
"parent":{
"id":8
}
},{
"id":11,
"name":"Node 3",
"parent":{
"id":9
}
}
]
Ожидаемый результат после вставки через контроллер:
id |name |parent_id
===========================
8 |Top Parent |null
9 |Node 1 |8
10 |Node 2 |8
11 |Node 3 |9
Дайте мне знать, если что-то неясно.Заранее спасибо!