java - 在 Spring MVC 中映射外键
问题描述
我是一个新的自学程序员,我正在制作我的第一个独立项目并遇到了一些问题。我正在制作一个测验应用程序,我想为测验创建一个课程,并为映射到每个测验的问题创建另一个课程。我创建了我认为应该是适当的模型、视图和控制器,但是在 mysql 中,没有任何东西可以将问题和测验映射在一起。我做了一个类似的教程,似乎休眠连接了数据,但这次没有发生。
我试图在 QuizCreateController 中重写我的 processCreateNewQuiz 方法,但到目前为止还没有成功。关于我应该向前迈进的任何想法?
以下是我认为的相关代码:
测验课
package org.launchcode.trivia.models;
import javax.persistence.Entity;
import javax.persistence.OneToMany;
import java.util.ArrayList;
import java.util.List;
@Entity
public class Quiz extends AbstractEntity {
public String name;
@OneToMany (mappedBy = "quiz")
private List<QuestionAnswerInfo> questions = new ArrayList<>();
public Quiz(){}
public Quiz(String name, ArrayList<QuestionAnswerInfo> questions) {
super();
this.name = name;
this.questions = questions;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<QuestionAnswerInfo> getQuestions() {
return questions;
}
public void setQuestions(List<QuestionAnswerInfo> questions) {
this.questions = questions;
}
public void addQuestions(List<QuestionAnswerInfo> questions, QuestionAnswerInfo question) {
questions.add(question);
}
}
QuestionAnswerInfo 类
package org.launchcode.trivia.models;
import javax.persistence.Entity;
import javax.persistence.ManyToOne;
@Entity
public class QuestionAnswerInfo extends AbstractEntity{
private String question;
private String answer;
private String questionType;
private String additionalAnswerInfo;
@ManyToOne
private Quiz quiz;
public QuestionAnswerInfo (){}
public QuestionAnswerInfo(String question, String answer, String questionType, String additionalAnswerInfo,
Quiz quiz) {
super();
this.question = question;
this.answer = answer;
this.questionType = questionType;
this.additionalAnswerInfo = additionalAnswerInfo;
this.quiz = quiz;
}
public String getQuestion() {
return question;
}
public void setQuestion(String question) {
this.question = question;
}
public String getAnswer() {
return answer;
}
public void setAnswer(String answer) {
this.answer = answer;
}
public String getQuestionType() {
return questionType;
}
public void setQuestionType(String questionType) {
this.questionType = questionType;
}
public String getAdditionalAnswerInfo() {
return additionalAnswerInfo;
}
public void setAdditionalAnswerInfo(String additionalAnswerInfo) {
this.additionalAnswerInfo = additionalAnswerInfo;
}
}
测验创建控制器
package org.launchcode.trivia.controllers;
import org.launchcode.trivia.models.QuestionAnswerInfo;
import org.launchcode.trivia.models.Quiz;
import org.launchcode.trivia.models.data.QuestionRepository;
import org.launchcode.trivia.models.data.QuizRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.ArrayList;
import java.util.List;
@Controller
public class QuizCreateController {
@Autowired
private QuestionRepository questionRepository;
@Autowired
private QuizRepository quizRepository;
@RequestMapping("create")
public String displayCreateNewQuiz(Model model) {
model.addAttribute(new Quiz());
model.addAttribute("questions", new QuestionAnswerInfo());
return "create";
}
@PostMapping("create")
public String processCreateNewQuiz(@ModelAttribute Quiz newQuiz, @ModelAttribute QuestionAnswerInfo questions,
Model model) {
List<QuestionAnswerInfo> quizQuestions = new ArrayList<>();
quizQuestions.add(questions);
newQuiz.setQuestions(quizQuestions);
quizRepository.save(newQuiz);
questionRepository.save(questions);
return "index";
}
}
create.html 查看
<!DOCTYPE html>
<html lang="en" xmlns:th="https://www.thymeleaf.org/">
<head>
<meta charset="UTF-8"/>
<title>Title</title>
</head>
<body>
<h1>Create a Quiz</h1>
<form method="post">
<div>
<label th:for="name">Quiz Name</label>
<input th:field="${quiz.name}"/>
</div>
<br>
<div>
<label th:for="question">Add a Question</label>
<input th:field="${questions.question}"/>
</div>
<div>
<label th:for="answer">Add an Answer</label>
<input th:field="${questions.answer}"/>
</div>
<div>
<label th:for="questionType">Question Type</label>
<input th:field="${questions.questionType}"/>
</div>
<div>
<label th:for="additionalAnswerInfo">Add Additional Information</label>
<input th:field="${questions.additionalAnswerInfo}"/>
</div>
<input type="submit" value="Create Quiz"/>
</form>
</body>
</html>
如果您需要更多信息来帮助我,请告诉我。我还在学习如何寻求帮助!
谢谢!
解决方案
我做了这项工作,至少是单向的。我不确定我需要双向。我需要在 Quiz 中更改 @OneToMany 中的注释,并更改控制器方法。
测验模型代码要注意:
@OneToMany (cascade = CascadeType.ALL)
@JoinColumn(name = "quiz_question_foreign_id", referencedColumnName = "id")
private List<QuestionAnswerInfo> questions = new ArrayList<>();
控制器
@PostMapping("create")
public String processCreateNewQuiz(@ModelAttribute Quiz newQuiz, @ModelAttribute QuestionAnswerInfo questions,
Model model) {
newQuiz.getQuestions().add(questions);
quizRepository.save(newQuiz);
return "index";
}
推荐阅读
- nested-loops - 如何使用嵌套列表在井字游戏中实现 Tie 功能
- php - 使用另一个数组PHP中的值复制数组内的值
- sql - 在 Windows 7 中安装 SQL Express 2017
- multithreading - c++/cli 中的线程
- c# - C# Rx DistinctUntilChanged() 用于任何结果,包括列表
- php - PHP 7 发送响应后继续执行
- mysql - vb6 连接到 mysql :[Microsoft][ODBC Driver Manager] 未找到数据源名称且未指定默认驱动程序
- apache-kafka - kafka 主题有两个 avro 类
- php - 错误:在 Drupal 8 中调用 null 上的成员函数 uuid()
- python - Python/selenium:我怎么可能从不同的页面得到相同的项目?page_source 有什么问题?