繁体   English   中英

如何将列的值设置为列表中实体的位置索引?

[英]How do I make a column's value set to position index of the entity in the list?

我有两个实体,“问题和答案”,具有一对多关系。 用户创建问题时,他/她可以指定2至4个答案作为多项选择。 问题表具有一个ID(主键)和提示列。 Answer表具有question_id,order和text列,而question_id和order列是该表中的主键(复合键)。 question_id是外键,指的是Question表中问题的ID。 订单列指定问题的选项#。 我正在尝试弄清楚如何在Question和Answer类之间进行映射(使用批注),以便在插入新问题时,Answer表中的order列的取值范围为0到3(4个答案),具体取决于用户为用户界面中的问题指定的许多答案。 因此,如果使用3个答案创建了一个Question,则这两个表如下所示:

问题表:

ID提示

500,“这是ID为500的问题”

AnswerTable记录:

Question_ID,顺序,文字

500,0,答案1; 500,1,答案2; 500,2,答案3;

到目前为止,我有以下内容,但它不起作用:

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

    @Id
    @GeneratedValue
    @Column(name = "id")
    private Integer id;

    @Column(name = "prompt")
    private String prompt;

    @OneToMany(mappedBy = "question")
    @OrderColumn(name = "order")
    private List<Answer> answers;
}


@Entity
@Table
public class Answer{
    @Embeddable
    private class AnswerId {
        @Column(name="question_id")
        private Integer questionId;

        @Column(name="order")
        private Integer order;         
    }

    @EmbeddedId
    private AnswerId id;

    @ManyToOne
    @JoinColumn(name="question_id")
    private Question question;

    @Column(name="text")
    private String text;
}

我得到一个映射异常:“实体映射中的重复列:答案列:question_id(应使用insert =“ false” update =“ false”映射)。 我确实读过一些Hibernate不支持同时使用@mappedBy和@OrderColumn批注的地方。 我该如何工作? 另外,当前Answer类具有对Question对象的引用,但是我从不需要访问Answer中的Question,那么如何删除该引用并仍然使整个映射工作? 谢谢

进行探查是因为您的Answer实体将question_id列映射到两个属性,在这两个属性中都通过注释进行了标记,以允许更改字段。

您可以按以下方式更改映射:

@Entity
@Table
public class Answer {
  /* other stuff */
  @ManyToOne
  @JoinColumn(name = "question_id", insertable = false, updatable = false)
  private Question question;
}

您还可以在域模型类中添加一个辅助方法,以帮助通过一些业务代码使这些值保持同步:

public class Answer {
  public void linkQuestion(Question question) { 
    getId().setQuestionId(question.getId());
    this.question = question;
  }
}

但是,您要避免在setQuestion方法中进行任何此类更改,因为这可能导致休眠状态的脏检查问题。

更新

是的,您可以具有单向@OneToMany映射。

@Entity
public class Question {
  /* other stuff */
  @OneToMany
  @JoinColumn(name = "QUESTION_ID")
  @OrderColumn(name = "order")
  private List<Answer> answers;

  /* utility method for adding an answer to question */
  public void addAnswer(Answer answer) {
    if(answers == null)
      answers = new ArrayList<>();
    answer.getId().setQuestionId(this.id);
    answers.add(answer);
  }

}

在您的Answer实体中,删除Question属性和相关注释。 实用程序方法只是向您显示当您要向Question添加Answer实体时如何建立关系。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM