我正在尝试创建一个“游戏”,这只是为了学习,我想知道如何像研究游戏那样使用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”之类的答案,该如何处理?
因此,主题可以是“自引用”实体,即可以具有可选的父主题和可选的子主题集合。
主题可以嵌套到任何级别:TopicA> TopicA_1> Topic_A_1_1等。
通过在Topic中编写一个递归函数,我们可以走到树上,并在层次结构中任何级别的Topic上获取该主题及其所有子主题的问题。
话题:
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; }
因此,通过引用某个主题,我可以只获取其直接问题,也可以获取其所有问题以及所有子主题(及其所有子主题.....)的问题。
Topic topic = topicRepository.findOne(someId); //only questions directly linked to this topic Set<Question> questions = topic.getQuestions(); //all questions linked to this topic and its sub-topics to *n* levels. Set<Question> questions = topic.getAllQuestions();