外键未在我的实体中设置

时间:2012-01-05 13:46:13

标签: java java-ee jpa

当我持久化问题实例时,与该问题相关的答案对象不会将外键设置为问题的主键。但是,问题实例和属于它的所有答案都会成功保存到数据库中。

如果您需要更多代码,我会添加它。

提问实体

@OneToMany(mappedBy = "question", fetch = FetchType.EAGER, cascade = { CascadeType.ALL })
@OrderBy("serialNumber ASC")
private List<Answer> answers;

回答实体

@ManyToOne(fetch = FetchType.LAZY)
private Question question;

或者我是否通过set方法手动为每个答案分配问题实例?

更新 哦,我尝试在每个答案对象的setter上设置问题实例,并且它有效。但是,当你使用上面的级联规则时,有人会说这是否正确。您仍然需要手动将它们连接在一起。

3 个答案:

答案 0 :(得分:2)

是的,这是对的。 Hibernate使用关联的拥有方来保持关联。拥有方是没有“mappedBy”属性的一方。

级联将在您保留问题时使所有答案持久,并在合并问题时合并答案,对所有其他操作也类似。但这种关联必须由你处理。

答案 1 :(得分:1)

我认为你必须这样做。 cascadeType.ALL仅表示如果您对Question执行任何操作(例如保留它),则所有Answer也将保留。

答案 2 :(得分:1)

嗯..是的我确实认为你必须在双向关联中手动设置对象的assoiaction。我添加你应该做的答案

Answer a = new Answer();
question.addAnswer(a);
answer.setQuestion(question);

至少,如果你想让关系是双向的,即能够从回答到问题,反之亦然。