【问题标题】:OneToMany, ManyToOne why value of parent in children is null?OneToMany,ManyToOne 为什么子项中父项的值为空?
【发布时间】:2011-03-15 19:33:33
【问题描述】:

我读过类似的问题,但仍有问题。

配置信息: 休眠 3.5.1

父类问题:

@Entity
public class Question implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="questionId")
    private long id;
    private String title;
    private String description;

    @OneToMany(cascade=CascadeType.ALL, mappedBy="question")
    private Set<Vote> votes;

    public void addVote(Vote vote){
        if(votes==null)
            votes = new HashSet<Vote>();
        getVotes().add(vote);
    }

}

儿童类投票:

@Entity
public class Vote implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="voteId")
    private long id;

    private transient InetAddress address;

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

    @Enumerated(EnumType.STRING)
    private Mode mode;

// ...
}

最后是非常简单的测试:

@Test
public void testSaveOrUpdate() {
Vote vote1 = new Vote();
    vote1.setAddress(InetAddress.getLocalHost());
    vote1.setMode(Mode.HIM);
    question = new Question();
    question.setTitle("test?");
    question.setDescription("test");
    question.addVote(vote1);

    question2 = questionDao.saveOrUpdate(question);
    assertNotNull(question2);
    Set<Vote> votes = question.getVotes();
    assertEquals(votes.size(), 1);
    for(Vote vote:votes)
        assertNotNull(vote.getQuestion());
}

测试失败,因为 vote.getQuestion() 返回 null。当我签入数据库时​​,questionId 列中有空值。我的问题是我应该怎么做才能从 votes 中引用 vote 中的 question?映射有问题,但我不知道是什么。

【问题讨论】:

  • 如果在持久化之前明确调用 Vote.setQuestion(..) 会发生什么?
  • 获取 StackOverflowException 因为实体管理器将循环引用并生成插入的无限循环。
  • 真的吗?我必须说,这在我看来并不自然。

标签: java hibernate jpa-2.0


【解决方案1】:

在所有关系中都有拥有方(至少在 ORM 中)。在您的多对一案例中,您已将投票作为拥有方。这意味着,将自己与问题相关联是投票的依赖性。因此 question.addVote(vote1) 将不起作用,但 vote.setQuestion(question) 将使一切正常。 Vote 是拥有方,因为您在这一方声明了 JoinColumn,在 Question 方声明了 mappedBy 字段。

编辑:您现在应该坚持投票对象而不是问题对象以产生任何影响。

【讨论】:

  • 然后我应该坚持投票而不是质疑?
  • 已编辑..去过那里,做到了。仔细阅读文档,开源人员用非常小的字体编写:P
  • 问题不在于阅读……问题在于知道自己想做什么。谢谢帮助。
  • 作为一名工程师,我非常诚实的建议,尽可能多地阅读设计原则和模式,你就会知道什么时候该做什么。优化是下一步。愿原力与你同在:D
猜你喜欢
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
  • 2018-09-11
  • 2019-02-15
  • 2017-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多