Родителю не лень грузить детей в любом случае - PullRequest
0 голосов
/ 06 декабря 2018

Я разрабатываю REST API, и у меня есть Question родитель и AnswerUser, связанный с обоими) детьми.Чего я хочу добиться, так это того, что с questionService.getAllQuestions() из базы данных загружаются только вопросы и пользователи.Когда я звоню questionService.getQuestion(id), я хочу, чтобы этот вопрос был загружен из базы данных вместе со всеми ответами и пользователями (которые ответили), которые содержит этот вопрос.Spring-boot

автоматически преобразует все данные в объекты JSON. Но в моей текущей ситуации, даже с getAllQuestions(), ВСЕ данные загружаются из базы данных.Это бессмысленно для запроса обзора вопроса, но необходимо для запроса подробностей вопроса.

Родитель вопроса Объект:

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonManagedReference;

import javax.persistence.*;
import java.sql.Timestamp;
import java.util.Set;

@Entity
@Table(name = "vragen")
public class Question extends BaseEntity {
    @Column(name = "vraag")
    private String question;

    @Column(name = "bericht")
    private String message;

    @ManyToOne
    @JoinColumn(name = "gebruiker")
    private Gebruiker gebruiker;

    @Column(name = "beantwoord", insertable = false)
    private boolean answered;

    @Column(name = "gepost_op", insertable = false)
    private Timestamp postedOn;

    @Column(name = "actief", insertable = false)
    @JsonIgnore
    private boolean active;

    @OneToMany(mappedBy = "question")
    @JsonManagedReference
    private Set<Answer> answers;


    public Question() {}

    public Question(String question, String message, Gebruiker gebruiker) {
        this.question = question;
        this.message = message;
        this.gebruiker = gebruiker;
    }

    public String getQuestion() {
        return question;
    }

    public void setQuestion(String question) {
        this.question = question;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Gebruiker getGebruiker() {
        return gebruiker;
    }

    public void setGebruiker(Gebruiker gebruiker) {
        this.gebruiker = gebruiker;
    }

    public boolean isAnswered() {
        return answered;
    }

    public void setAnswered(boolean answered) {
        this.answered = answered;
    }

    public Timestamp getPostedOn() {
        return postedOn;
    }

    public boolean isActive() {
        return active;
    }

    public void setActive(boolean active) {
        this.active = active;
    }

    public Set<Answer> getAnswers() {
        return answers;
    }

    public void setAnswers(Set<Answer> answers) {
        this.answers = answers;
    }
}

Объект ответа:

import com.fasterxml.jackson.annotation.JsonBackReference;

import javax.persistence.*;
import javax.validation.constraints.Size;
import java.sql.Timestamp;

@Entity
@Table(name = "antwoorden")
public class Answer extends BaseEntity {
    @Size(min = 10)
    @Column(name = "bericht")
    private String message;

    @ManyToOne
    @JoinColumn(name = "gebruiker")
    private Gebruiker gebruiker;

    @ManyToOne
    @JoinColumn(name = "vraag")
    @JsonBackReference
    private Question question;

    @Column(name = "gepost_op", insertable = false)
    private Timestamp postedOn;

    @Column(name = "actief", insertable = false)
    private boolean active;


    public Answer() {}

    public Answer(String message, Gebruiker gebruiker, Question question) {

    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Gebruiker getGebruiker() {
        return gebruiker;
    }

    public void setGebruiker(Gebruiker gebruiker) {
        this.gebruiker = gebruiker;
    }

    public Question getQuestion() {
        return question;
    }

    public void setQuestion(Question question) {
        this.question = question;
    }

    public Timestamp getPostedOn() {
        return postedOn;
    }

    public boolean isActive() {
        return active;
    }

    public void setActive(boolean active) {
        this.active = active;
    }
}

@OneToMany по умолчанию лениво загружает ответы, чего не происходит, даже если я явно установил эту опцию.

Можно ли этого добиться с помощьюJPA или мне нужно писать запросы вручную в пользовательской реализации?

1 Ответ

0 голосов
/ 15 декабря 2018

Я заметил, что это вызывает Джексон, а именно @JsonManagedReference.Удаление его и добавление @JsonBackReference делает его ленивой загрузкой правильно, хотя эта аннотация здесь не на самом деле.

См. Сконфигурируйте Джексона, чтобы опустить атрибуты ленивой загрузки в Spring Boot для реальногорешение

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