Java 如何制作列';s值设置为列表中实体的位置索引?
我有两个实体,问答,它们有一对多的关系。当用户创建一个问题时,他/她可以将2到4个答案指定为多选。问题表有一个id(主键)和提示列。答案表中有问号、顺序和文本列,问号和顺序列是表中的主键(复合键)。问题id是外键,它引用问题表中问题的id。“顺序”列指定问题的选项。我正在尝试找出如何在问答类之间进行映射(使用注释),以便在插入新问题时,答案表中的order列根据用户在UI中为该问题指定的答案数量获得0到3(4个答案)之间的值。因此,如果用户创建了一个包含3个答案的问题,那么这两个表将如下所示: 问题表: id提示 500,“这是id为500的问题” 可回答的记录: 问题号、顺序、文本 500,0,回答1;500,1,回答2;500,2,回答3 到目前为止,我有以下问题,但它不起作用:Java 如何制作列';s值设置为列表中实体的位置索引?,java,mysql,hibernate,Java,Mysql,Hibernate,我有两个实体,问答,它们有一对多的关系。当用户创建一个问题时,他/她可以将2到4个答案指定为多选。问题表有一个id(主键)和提示列。答案表中有问号、顺序和文本列,问号和顺序列是表中的主键(复合键)。问题id是外键,它引用问题表中问题的id。“顺序”列指定问题的选项。我正在尝试找出如何在问答类之间进行映射(使用注释),以便在插入新问题时,答案表中的order列根据用户在UI中为该问题指定的答案数量获得0到3(4个答案)之间的值。因此,如果用户创建了一个包含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;)类中的问题引用,并且仍保留我在原始帖子中解释的这项工作?感谢您的快速回复。