如何改进这种架构/抽象?

时间:2013-06-11 17:41:54

标签: java hibernate jpa schema persistence

我正在为在线考试模块制作一个webapp,并且想知道如何改进我当前的设计和抽象。考试是多种选择。

到目前为止,我的数据库中有三个表:

1.exam

  • exam_id(primary,auto-inc)
  • exam_name - 示例:“physics”等
  • num_questions
  • time_per_question
  • points_per_question

2.question

  • question_id - 主键,auto_inc
  • exam_id - FK引用考试中的exam_id,更新和删除 - 级联
  • question_text - 实际问题本身
  • question_figure - 如果问题附带的话,文件的名称 image(例如:graph.jpg)。可以为null
  • question_category
  • question_name - 唯一的,varchar,用来识别问题的东西(我打算使用这个字段,所以我有一个参考来添加答案选项,但感觉这是不必要的)

3.answer

  • answer_id - PK,auto_inc
  • question_id - 引用问题的外键引用question_id。级联更新/删除
  • ANSWER_TEXT
  • answer_correct - tiny int表示它是否正确答案
  • answer_name - 唯一的,varchar,对answer的引用,与question_name相同的是提问

这就是我对课程的想法:

public class Exam
{
    private int Id;
    private String name;
    private int timePerQuestionInSeconds;
    private int pointsPerQuestion;
    private int numberOfQuestions;
    private ArrayList<Question> questionList;
}

public class Question
{
    private int Id;
    private int examID;
    private String text;
    private String figure;
    private String category;
    private String name;
    private ArrayList<Answer> answers;
}

public class Answer
{
    private int id;
    private int questionId;
    private String text;
    private boolean correct;
    private String name;
}

因此,为了参加考试,我必须从考试中选择examname,然后从问题中选择examId,然后从答案中选择byquestionid。然后获取这些结果集并将它们映射到对象。

相反,如果我使用JPA来持久化这些实体,是否可以持久化实体的ArrayList?我在课堂考试中是否正确

@OneToMany(targetEntity = Question.class,mappedBy =“examID”)

private ArrayList(Question);

在课堂上我应该有

@ManyToOne

private examID;

设置所需的关系?顺便说一下,我正在使用Java SE,所以我不确定我是否拥有Java EE所拥有的所有支持。

我还需要在某种程度上存储学生的考试成绩。我正在考虑有一个表格分数,其中包含fk到学生ID,我可以通过学生ID查询该表格以返回学生的分数。

2 个答案:

答案 0 :(得分:0)

来自JPA的Appart,对于您编写的每个类,如果可能,您应该使用接口而不是具体类来声明bean变量。使用java.util.List而不是java.util.ArrayList。

答案 1 :(得分:0)

关于考试表中的num_question属性,这是必要的吗?从问题表中计算行数是不准确的?

此外,points_per_question是否取决于考试或问题? (我的想法是基于问题)。如果是这样,那么它应该是Question表的一个属性,也可能是time_per_question属性。 (困难或更长的问题允许更多时间?)这都是基于您的原始要求。

否则,它看起来不错。