OneToMany,ManyToOne为什么儿童父母的价值为零?

时间:2011-03-15 19:33:34

标签: java hibernate jpa-2.0

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

配置信息: Hibernate 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 列中有空值。我的问题是我应该怎样做才能在投票投票中引用问题?映射有问题,但我不知道是什么。

1 个答案:

答案 0 :(得分:1)

在所有关系中都有一个拥有方(至少在ORM中)。在你的多对一案例中,你已经将投票作为拥有者。这意味着,投票依赖于将自己与问题联系起来。因此,question.addVote(vote1)将无效,但vote.setQuestion(问题)将使一切正常。投票是拥有方,因为您已在此方面声明了JoinColumn,并在问题方面声明了mappedBy字段。

编辑:你现在应该坚持投票对象而不是问题对象才能产生任何效果。