Spring JPA Создать вопросы - PullRequest
       4

Spring JPA Создать вопросы

0 голосов
/ 27 февраля 2019

Я пытаюсь создать «игру», это просто для изучения, и я хотел бы знать, как можно было бы создать 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;
}

Также я вижу, что не могу создать ответ типа "ИСТИНА / ЛОЖЬ","ДА / НЕТ", "Маленькое описание", "МУЛЬТИ-ВЫБОР", как мне с этим справиться?

1 Ответ

0 голосов
/ 27 февраля 2019

Таким образом, тема может быть «самоссылающейся» сущностью, то есть может иметь необязательную родительскую тему и необязательный набор подтем.

Темы могут быть вложены на любой уровень: 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(); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...