[英]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.