JPA - разрешить нулевого родителя в рекурсивном запросе - PullRequest
0 голосов
/ 18 мая 2018

Я хочу создать организационную структуру с использованием 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

Дайте мне знать, если что-то неясно.Заранее спасибо!

1 Ответ

0 голосов
/ 23 мая 2018

Я нахожу обходной путь для моей проблемы.Итак, я ставлю здесь, если кто-то сталкивается со схожей проблемой со мной.Я добавил NativeQuery в свой репозиторий следующим образом:

@Query(value = "insert into tree values(:id,:name)", nativeQuery = true)
void saveTop(@Param("id")int id,@Param("name")String name);

И затем я добавил несколько строк в свой контроллер следующим образом:

@PostMapping("/top")
public void addTop(@RequestBody Node node){
    nodeRepository.saveTop(node.getId(),node.getName());
}

По сути, я создаю конечную точку ("/ узел/ top ") чтобы вручную вставить верхний узел для моего дерева структуры организации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...