Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何制作列';s值设置为列表中实体的位置索引?_Java_Mysql_Hibernate - Fatal编程技术网

Java 如何制作列';s值设置为列表中实体的位置索引?

Java 如何制作列';s值设置为列表中实体的位置索引?,java,mysql,hibernate,Java,Mysql,Hibernate,我有两个实体,问答,它们有一对多的关系。当用户创建一个问题时,他/她可以将2到4个答案指定为多选。问题表有一个id(主键)和提示列。答案表中有问号、顺序和文本列,问号和顺序列是表中的主键(复合键)。问题id是外键,它引用问题表中问题的id。“顺序”列指定问题的选项。我正在尝试找出如何在问答类之间进行映射(使用注释),以便在插入新问题时,答案表中的order列根据用户在UI中为该问题指定的答案数量获得0到3(4个答案)之间的值。因此,如果用户创建了一个包含3个答案的问题,那么这两个表将如下所示:

我有两个实体,问答,它们有一对多的关系。当用户创建一个问题时,他/她可以将2到4个答案指定为多选。问题表有一个id(主键)和提示列。答案表中有问号、顺序和文本列,问号和顺序列是表中的主键(复合键)。问题id是外键,它引用问题表中问题的id。“顺序”列指定问题的选项。我正在尝试找出如何在问答类之间进行映射(使用注释),以便在插入新问题时,答案表中的order列根据用户在UI中为该问题指定的答案数量获得0到3(4个答案)之间的值。因此,如果用户创建了一个包含3个答案的问题,那么这两个表将如下所示:

问题表:

id提示

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

可回答的记录:

问题号、顺序、文本

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;
}
@实体
@表(name=“问题”)
公开课问题{
@身份证
@生成值
@列(name=“id”)
私有整数id;
@列(name=“prompt”)
私有字符串提示;
@OneToMany(mappedBy=“问题”)
@OrderColumn(name=“order”)
私人名单答案;
}
@实体
@桌子
公开课答案{
@可嵌入
私人类应答器{
@列(name=“question\u id”)
私有整数问号;
@列(name=“order”)
私有整数阶;
}
@嵌入ID
私人应答id;
@许多酮
@JoinColumn(name=“question\u id”)
私人问题;
@列(name=“text”)
私有字符串文本;
}

我得到了一个映射异常:“实体映射中的重复列:回答列:问题\u id(应使用insert=“false”update=“false”)映射”)。我确实在一些地方读到Hibernate不支持同时使用@mappedBy和@OrderColumn注释。我该怎么做?另外,当前Answer类有一个对Question对象的引用,但我不需要访问来自Answer的问题,因此如何删除该引用并使整个映射工作正常?谢谢

这个问题是因为您的
答案
实体将
问题id
列映射到两个属性,在这两个属性中都通过注释进行标记,以允许更改字段

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

@Entity
@Table
public class Answer {
  /* other stuff */
  @ManyToOne
  @JoinColumn(name = "question_id", insertable = false, updatable = false)
  private Question question;
}
如果愿意,您还可以向域模型类添加一个helper方法,以通过一些业务代码帮助保持这些值的同步:

public class Answer {
  public void linkQuestion(Question question) { 
    getId().setQuestionId(question.getId());
    this.question = question;
  }
}
但是,您希望避免在
setQuestion
方法中进行任何类型的更改,因为这可能会导致hibernate的脏检查出现问题

更新

是的,您可以拥有单向
@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);
  }

}
@实体
公开课问题{
/*其他东西*/
@独身癖
@JoinColumn(name=“QUESTION\u ID”)
@OrderColumn(name=“order”)
私人名单答案;
/*添加问题答案的实用方法*/
公共无效添加应答(应答){
if(answers==null)
answers=newarraylist();
answer.getId().setQuestionId(this.id);
答案。添加(答案);
}
}

答案
实体中,删除
问题
属性和相关注释。实用工具方法简单地向您展示了当您想将
答案
实体添加到
问题

时,您是如何建立关系的。对注释进行修改确实修复了我遇到的错误。我还有一些测试要做,所以我会接受你的答案,一旦我有它做我想要的。此外,是否可以完全删除Answer(@ManyToOne@JoinColumn(name=“Question_id”,insertable=false,updateable=false)private Question-Question;)类中的问题引用,并且仍保留我在原始帖子中解释的这项工作?感谢您的快速回复。