Отображение Quarkus Panache 1: m не дает должного ответа

Я пытаюсь протестировать отображение 1: m на кваркусе с помощью gradle. Используемые расширения:

quarkus-hibernate-orm-panache '

кваркус-пружинная паутина '

ПОЧТАЛЬОН:

POST на http: // localhost: 8080 / tree с запросом:

{
"name":"mango",
"fruits": [
    {"name":"a",
     "color":"red"
    },
    {"name":"b",
     "color":"yellow"
    }
]
}

Теперь при выполнении GET на http: // localhost: 8080 / tree фрукты отображаются как пустые. Почему он идет пустым, не могу найти.

[
    {
        "treeId": 1,
        "name": "mango",
        "fruits": []
    }
]

Я использовал следующий класс контроллера и 2 класса сущности.

@RestController
public class TreeController {
    
    @PostMapping("/tree")
    @Transactional
    public void addTree(Tree tree) {
        Tree.persist(tree);
    }
    
    @GetMapping("/tree")
    public List<Tree> getTree() {
        return Tree.listAll();
        
    }
}

@Entity
public class Tree extends PanacheEntityBase{
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long treeId;
    
    public String name;
    
    @OneToMany(mappedBy = "tree", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
    public List<Fruit> fruits;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Fruit> getFruits() {
        return fruits;
    }

    public void setFruits(List<Fruit> fruits) {
        this.fruits = fruits;
    }

    public Long getTreeId() {
        return treeId;
    }

    public void setTreeId(Long treeId) {
        this.treeId = treeId;
    }



}

@Entity
public class Fruit extends PanacheEntityBase {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long fruitId;
    public String name;
    public String color;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="treeId")
    public Tree tree;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public Tree getTree() {
        return tree;
    }

    public void setTree(Tree tree) {
        this.tree = tree;
    }

    public Long getFruitId() {
        return fruitId;
    }

    public void setFruitId(Long fruitId) {
        this.fruitId = fruitId;
    }
}

person abdullah imran    schedule 26.03.2021    source источник


Ответы (1)


Можете ли вы попробовать установить обратную ссылку перед сохранением?

@RestController
public class TreeController {
    
    @PostMapping("/tree")
    @Transactional
    public void addTree(Tree tree) {
        for(Fruit fruit : tree.fruits)
             fruit.tree = tree;
        Tree.persist(tree);
    }
    
    @GetMapping("/tree")
    public List<Tree> getTree() {
        return Tree.listAll();
        
    }
}
person FroMage    schedule 26.03.2021
comment
После редактирования в соответствии с приведенным выше предложением при выполнении GET я получал исключение. org.jboss.resteasy.spi.UnhandledException: com.fasterxml.jackson.databind.JsonMappingException: бесконечная рекурсия (StackOverflowError) (через цепочку ссылок: которая была разрешена после добавления @JsonIgnore public Tree tree; в объекте Fruit. - person abdullah imran; 29.03.2021
comment
Верно, этого и следовало ожидать. - person FroMage; 30.03.2021