Spring JPA创建问题

时间:2019-02-27 14:03:36

标签: spring hibernate spring-boot jpa spring-data-jpa

我正在尝试创建一个“游戏”,这只是为了学习,我想知道如何像研究游戏那样用JPA进行创建的好方法,例如:

我在主目录中有这些类/表

Question : text, description, set<Answer>, difficulty, userWhoCreated, Topic
Topic : name, set<question>
SubTopic : name, set<question>
Answer : text, question (to reference to it)
Quiz : set<question>, name, description

但是到那时,我想拥有一个存储所有这些问题的存储库,因此,当用户想要学习一点点内容时,只需从该存储库中获取问题即可。

主题和子主题的目的是例如当用户需要问题时将其过滤掉。

示例

问题:什么是加入? 主题将是数据库 子主题为“加入”

您能指导我如何进行此操作吗?

我的问题课的例子

@Entity(name = "question")
public class Question extends DateAudit {
    @Id
    @Column(name = "question_id")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "question_seq")
    @SequenceGenerator(name = "question_seq", allocationSize = 1)
    private Long id;

    @Column(name = "name")
    @NotBlank(message = "Question name can not be blank")
    private String name;

    @Column(name = "is_exam_question", nullable = false)
    private Boolean is_exam_question;

    @ManyToOne(fetch = FetchType.EAGER, cascade = { CascadeType.PERSIST, CascadeType.MERGE })
    private Set<Answer> answers = new HashSet<>();

}

示例答案实体

@Entity(name = "answer")
public class Answer extends DateAudit {

    @Id
    @Column(name = "answer_id")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "answer_seq")
    @SequenceGenerator(name = "answer_seq", allocationSize = 1)
    private Long id;

    @Column(name = "answer_to_question")
    @NotBlank(message = "Answer to question name can not be blank")
    private String answer_to_question;

    @ManyToOne
    private Question question;

    @Column(name="type_answer")
    private AnswerType answerType;
}

我还看到我无法创建“ TRUE / FALSE”,“ YES / NO”,“ Small description”,“ MULTI-CHOICE”之类的答案?

1 个答案:

答案 0 :(得分:1)

因此,主题可以是“自引用”实体,即可以具有可选的父主题和可选的子主题集合。

主题可以嵌套到任何级别:TopicA> TopicA_1> Topic_A_1_1等。

通过在Topic中编写递归函数,我们可以在树中走动,并且对于层次结构中任何级别的Topic都可以获取该Topic及其所有子主题的问题。

主题:

#include <stdio.h>
#include <stdlib.h>

#define DIM 4

void showCube(char**** cube, int dim) {
  int a, b, c;
  for(c = 0; c < dim; c++) {
    for(b = 0; b < dim; b++) {
      for(a = 0; a < dim; a++) {
        printf("%c ", *cube[c][b][a]); 
      }
      printf("\n");
    }
    printf("50*-\n");
  }
}

int main() {
  char*** cube = (char***)malloc(sizeof(char**) * DIM);
  int a, b, c;
  for(c = 0; c < DIM; c++) {
    cube[c] = (char**)malloc(sizeof(char**) * DIM);
    for(b = 0; b < DIM; b++) {
      cube[c][b] = (char*)malloc(sizeof(char*) * DIM);
      for(a = 0; a < DIM; a++) {
        cube[c][b][a] = ((a + b + c) % 26) + 'A'; 
      }
    }
  }

  showCube(&cube, DIM);

  for(c = 0; c < DIM; c++) {
    for(b = 0; b < DIM; b++) {
      for(a = 0; a < DIM; a++) {
        free(cube[c][b][a]); 
      }
      free(cube[c][b]);
    }
    free(cube[c]);
  }
  free(cube);
  return 0;
}

问题:

Entity
@Table(name = "topics")
public class Topic{

    @Id
    private Long id;

    @OneToMany(mappedBy = "parent")
    private Set<Topic> subTopics;

    @ManyToOne
    @JoinColumn(name = "parent_id")
    private Topic parent;

    @OneToMany(mappedBy = "topic")
    private Set<Question> questions;

    //questions for this exact topic
    public Set<Question> getQuestions(){
        return questions;
    }

    //questions for this topic and all its sub-topics
    public Set<Question> getAllQuestions(){
        return getAllQuestions(this);
    }

    //recursive function to walk the topic tree and get all questions for each sub-topic
    private Set<Question> getAllQuestions(Topic topic){
        Set<Question> questions = new HashSet<>(topic.getQuestions());

        for(Topic subTopic : topic.getSubTopics()){
            questions.addAll(getAllQuestions(subTopic));
        )

        return  questions;
    }
}

因此,通过引用某个主题,我可以只获得其直接问题,也可以得到其所有问题以及所有子主题(及其所有子主题.....)的问题

@Entity
@Table(name = "questions")
public class Question {

    @ManyToOne
    @JoinColumn(name = "topic_id")
    private Topic topic;
}