Я пытаюсь создать классы сущностей JPA для базы данных викторины, где у меня есть две сущности Вопросы и опции.
Подход 1
Создать и отношение OneToMany из Вопроса кОпция, подобная этой
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private Set<Option> options = new HashSet<>();
И отношение ManyToOne, созданное из сущности опций, подобной этой
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "questionId")
private Question question;
Она работала нормально, за исключением того факта, что она создала дополнительную таблицу.в этой таблице.Кроме того, в Option есть столбец questionId и его ноль для всех записей.
Я хочу избежать этой дополнительной таблицы и добавить вопросительный вопрос в таблицу параметров. Поэтому после небольшого поиска в Google я узнал, что мне нужноиспользовать атрибут mappedBy.
Подход 2
Сущность вопроса
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy="question")
private Set<Option> options = new HashSet<>();
Опция Сущность
@ManyToOne(fetch = FetchType.LAZY)
private Question question;
Теперь таблица соединения не создается, вместо этогоСтолбец question_questionId добавляется в таблицу параметров, но снова становится пустым.Из-за этого моя конечная точка не возвращает варианты с вопросом.
Я надеюсь, что мой вопрос ясен.Как заполнить вопросник в таблице параметров.
РЕДАКТИРОВАТЬ
Полный вопрос сущности
@Entity
@Table(name="questions")
public class Question implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int questionId;
private String author;
private boolean expired;
private String questionText;
//bi-directional many-to-one association to Option
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy="question")
private Set<Option> options = new HashSet<>();
public Question() {
}
public int getQuestionId() {
return this.questionId;
}
public void setQuestionId(int questionId) {
this.questionId = questionId;
}
public String getAuthor() {
return this.author;
}
public void setAuthor(String author) {
this.author = author;
}
public boolean isExpired() {
return expired;
}
public void setExpired(boolean expired) {
this.expired = expired;
}
public String getQuestionText() {
return this.questionText;
}
public void setQuestionText(String questionText) {
this.questionText = questionText;
}
public Set<Option> getOptions() {
return this.options;
}
public void setOptions(Set<Option> options) {
this.options = options;
}
public Option addOption(Option option) {
getOptions().add(option);
option.setQuestion(this);
return option;
}
public Option removeOption(Option option) {
getOptions().remove(option);
option.setQuestion(null);
return option;
}
}
Параметр Entity @Entity @Table (name = "options") открытый класс Option реализует Serializable {private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int optionId;
private boolean correctAnswer;
private String optionText;
//bi-directional many-to-one association to Question
@ManyToOne(fetch = FetchType.LAZY)
private Question question;
public Option() {
}
public int getOptionId() {
return this.optionId;
}
public void setOptionId(int optionId) {
this.optionId = optionId;
}
public boolean isCorrectAnswer() {
return correctAnswer;
}
public void setCorrectAnswer(boolean correctAnswer) {
this.correctAnswer = correctAnswer;
}
public String getOptionText() {
return this.optionText;
}
public void setOptionText(String optionText) {
this.optionText = optionText;
}
public Question getQuestion() {
return this.question;
}
public void setQuestion(Question question) {
this.question = question;
}
}
Репозиторий
@Repository
public interface QuestionRepository extends CrudRepository<Question,Long>{
}
Класс обслуживания
@Autowired
private QuestionRepository questionRepository;
public Question getQuestion(Long id) {
Question question= questionRepository.findOne(id);
Set<Option> options = question.getOptions();
options.forEach(s -> s.setCorrectAnswer(false));
return question;
}
public Question addQuestion(Question question) {
return questionRepository.save(question);
}
Контроллер
@GetMapping
@RequestMapping(method = RequestMethod.GET, value="/questions/{id}")
public ResponseEntity<Question> getQuestion(@PathVariable long id) {
return new ResponseEntity<Question>(questionService.getQuestion(id),HttpStatus.OK);
}
@PostMapping
@RequestMapping(method = RequestMethod.POST, value= "/questions")
@Transactional
public ResponseEntity<Question> addQuestion(@RequestBody Question question) {
logger.info("Request recieved from client : " + question.toString());
return new ResponseEntity<Question>(questionService.addQuestion(question),HttpStatus.OK);
}