我读过类似的问题,但仍有问题。
配置信息: 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 列中有空值。我的问题是我应该怎样做才能在投票的投票中引用问题?映射有问题,但我不知道是什么。
答案 0 :(得分:1)
在所有关系中都有一个拥有方(至少在ORM中)。在你的多对一案例中,你已经将投票作为拥有者。这意味着,投票依赖于将自己与问题联系起来。因此,question.addVote(vote1)将无效,但vote.setQuestion(问题)将使一切正常。投票是拥有方,因为您已在此方面声明了JoinColumn,并在问题方面声明了mappedBy字段。
编辑:你现在应该坚持投票对象而不是问题对象才能产生任何效果。