第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 hibernate 創(chuàng)建空外鍵?

為什么 hibernate 創(chuàng)建空外鍵?

楊魅力 2023-11-01 21:47:47
我正在嘗試創(chuàng)建一個包含兩個實體的 Spring Boot 應用程序:Question 和 QuestionChoices。我正在使用雙向一對多關系。當我嘗試創(chuàng)建一個 Question 實體以及 QuestionChoices 列表時,QuestionChoice 中的外鍵為空。這是我的 QuestionChoice 實體:@Entity@Data@NoArgsConstructor@AllArgsConstructorpublic class QuestionChoice {    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private int id;    private String choice;    @ManyToOne    @JoinColumn(name = "question_id")    private Question question;    public QuestionChoice(String choice, Question question) {        this.choice = choice;        this.question = question;    }    public QuestionChoice(String choice) {        this.choice = choice;    }}這是我的問題實體:@Entity@Data@NoArgsConstructor@AllArgsConstructorpublic class Question {    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private int question_id;    private String questionName;    private String questionText;    @OneToMany(mappedBy = "question", cascade = CascadeType.ALL)    private List<QuestionChoice> questionChoices;    public Question(String questionName, String questionText, List<QuestionChoice> questionChoices) {        this.questionName = questionName;        this.questionText = questionText;        this.questionChoices = questionChoices;        this.questionChoices.forEach(x -> x.setQuestion(this));    }}我有一個 QuestionRepository 和 QuestionChoiceRepository:@Repositorypublic interface QuestionRepository extends JpaRepository<Question, Integer> {}@Repositorypublic interface QuestionChoiceRepository extends JpaRepository<QuestionChoice, Integer> {}這是我的控制器:@RestControllerpublic class Controller {    QuestionRepository questionRepository;    QuestionChoiceRepository questionChoiceRepository;    public Controller(QuestionRepository questionRepository,                      QuestionChoiceRepository questionChoiceRepository) {        this.questionRepository = questionRepository;        this.questionChoiceRepository = questionChoiceRepository;    }
查看完整描述

3 回答

?
MMMHUHU

TA貢獻1834條經(jīng)驗 獲得超8個贊

questionChoices您正在JSON 正文中發(fā)送一個字符串數(shù)組。List<Question>您的 JSON 映射器需要從該字符串數(shù)組中填充 a 。所以它需要將每一個都轉化String為一個QuestionChoice對象。據(jù)推測,它是通過調用QuestionChoice以 aString作為參數(shù)的構造函數(shù)來實現(xiàn)的。

因此,您正在保存一個Question其中QuestionChoices所有屬性都為空的question屬性。因此,您告訴 JPA 所有 QuestionChoices 都沒有任何問題(因為它為空)。因此,JPA 會保存您告訴它保存的內容:QuestionChoices,而沒有任何父問題。

您需要正確question初始化QuestionChoice.


查看完整回答
反對 回復 2023-11-01
?
躍然一笑

TA貢獻1826條經(jīng)驗 獲得超6個贊

反序列化器將始終使用默認構造函數(shù)來構造對象。您的自定義構造函數(shù)對反序列化沒有影響。


你能做的是:


1 - 保證服務/控制器層中的關聯(lián)


@PostMapping("/question")

public Question createQuestion(@RequestBody Question question) {

    question.getQuestionChoices().forEach(choice -> choice.setQuestion(question));

    return questionRepository.save(question);

}

或 2 - 保證 setter 方法中的關聯(lián):


public class Question {


    // omitted for brevity


    @OneToMany(mappedBy = "question", cascade = CascadeType.ALL)

    private List<QuestionChoice> questionChoices;


    public void setQuestionChoices(List<QuestionChoice> questionChoices) {

        if (questionChoices != null) {

            questionChoices.forEach(choice -> choice.setQuestion(this));

        }

        this.questionChoices = questionChoices;

    }

}

更新


為了防止無限遞歸,只需從“questionChoice”中刪除“question”屬性以進行演示。


我可以想到兩個選擇:


1 - 將question內部設置為 nullquestionChoice


@PostMapping("/question")

public Question createQuestion(@RequestBody Question question) {

    Question savedQuestion = questionRepository.save(question);

    savedQuestion.getQuestionChoices().forEach(choice -> choice.setQuestion(null));


    return savedQuestion;

}


@GetMapping("/question")

public List<Question> getQuestions() {

    List<Question> questions questionRepository.findAll();

    questions.forEach(question -> {

        question.getQuestionChoices.forEach(choice -> choice.setQuestion(null));

    });


    return questions;

}

這會將您的問題選擇和外鍵保存到數(shù)據(jù)庫中,但questionChoices.question在發(fā)送響應時將序列化為 null 以防止無限遞歸。


2 - 使用 DTO。


您創(chuàng)建 DTO 將它們序列化為響應對象,以準確返回您想要的內容。


QuestionDTO.java


public class QuestionDTO {


    private int question_id;

    private String questionName;

    private String questionText;


    // notice that here you're using composition of DTOs (QuestionChoiceDTO instead of QuestionChoice)

    private List<QuestionChoiceDTO> questionChoices;


    // constructors..


    // getters and setters..

}

QuestionChoiceDTO.java


public class QuestionChoiceDTO {


    private int id;

    private String choice;


    // notice that you don't need to create the Question object here


    // constructors..


    // getters and setters..


}

然后在你的控制器中:


@PostMapping("/question")

public QuestionDTO createQuestion(@RequestBody Question question) {

    Question savedQuestion = questionRepository.save(question);


    List<QuestionChoiceDTO> questionChoices = new ArrayList<>();

    savedQuestion.getQuestionChoices().forEach(choice -> {

        questionChoices.add(new QuestionChoiceDTO(choice.getId(), choice.getChoice()));

    });


    QuestionDTO response = new QuestionDTO(savedQuestion.getQuestion_id(), savedQuestion.getQuestionName(), savedQuestion.getQuestionText(), questionChoices);


    return response;

}


@GetMapping("/question")

public List<QuestionDTO> getQuestions() {

    List<Question> questions = questionRepository.findAll();

    List<QuestionDTO> response = new ArrayList<>();


    questions.forEach(question -> {

        List<QuestionChoicesDTO> questionChoices = new ArrayList<>();

        question.getQuestionChoices().forEach(choice -> questionChoices.add(new QuestionChoiceDTO(choice.getId(), choice.getChoice()));


        responses.add(new QuestionDTO(savedQuestion.getQuestion_id(), savedQuestion.getQuestionName(), savedQuestion.getQuestionText(), questionChoices));

    });

}

我總是更喜歡后者,因為對于大型項目,恕我直言,使用 DTO 可以成為組織代碼和簡潔使用請求/響應對象而不使用域對象的強大工具。


查看完整回答
反對 回復 2023-11-01
?
BIG陽

TA貢獻1859條經(jīng)驗 獲得超6個贊

您在請求后不使用構造函數(shù) public Question(...) 。你應該制定一種方法將選擇與問題聯(lián)系起來



查看完整回答
反對 回復 2023-11-01
  • 3 回答
  • 0 關注
  • 160 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號