我在Playframework 1.2.4中使用了Hibernate。

我有两节课:考试和问题。问题始终具有引用考试的属性。考试总是有一个属性指向一个名为specialQuestion的问题,一个属性指向一个问题集合。

java - 两个类之间具有多个关联的 hibernate 问题-LMLPHP

我的目标是创建一个涉及每个问题的特殊考试。在创建考试时,我会创建一个特殊问题。该问题已经很好地创建并保留在数据库中,检查也保留了,但是在没有引用特殊问题的情况下,匹配列用空值填充。

我不确定注解。问题是什么 ?

此静态方法返回默认的特殊问题

public static Question specialQuestion(Examination examination) {
        Question question = new Question();
        question.examination = examination;
        /* Other attributes affectations */
        return question;
}


在这里,它创建了一个Examination,影响了specialQuestion属性并持久化了该对象:

Examination examination = new Examination();
examination.specialQuestion = Question.specialQuestion(examination);
examination.save();


班级考试包含以下属性:

@OneToMany(cascade = CascadeType.ALL, mappedBy = "examination", fetch = FetchType.LAZY)
    public Set<Question> questions = new HashSet<Question>();

@OneToOne(cascade= CascadeType.ALL, mappedBy = "examination")
    public Question specialQuestion;


课程问题包含:

@ManyToOne
@OneToOne
public Examination examination;


编辑:

如果删除specialQuestion mappedBy批注中的@OneToOne注释和Question类中的@OneToOne批注以进行检查,则会出现错误:无法再加载实体检查。

这是DDL的重要部分:

CREATE TABLE `question` (
  `questionId` bigint(20) NOT NULL AUTO_INCREMENT,
  `examination_id` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`questionId`),
  KEY `FKBE5CA006E00B1456` (`examination_id`)
) ENGINE=MyISAM AUTO_INCREMENT=204 DEFAULT CHARSET=latin1;

CREATE TABLE `examination` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `specialQuestion` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;

最佳答案

您不能将@ManyToOne@OneToOne添加到同一属性,因为Hibernate需要知道哪一个是正确的。

而且由于拥有方是Question,Hibernate如何知道哪个问题是特殊问题?从数据库角度考虑:将关系存储在问题表中,您最终将获得引用同一考试的多个问题。如果这些是无序的(一组),您将如何根据可用数据确定特殊问题?
由于您无法做到这一点,Hibernate也不会做到这一点。

为了解决这个问题,您需要使Examination成为specialQuestion的拥有方,并且可能也仅是单向关系,即您不将其映射到Question中(删除mappedBy并添加一列作为参考)到检查表)。

10-04 11:32
查看更多