【发布时间】: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 因为实体管理器将循环引用并生成插入的无限循环。
-
真的吗?我必须说,这在我看来并不自然。