Java 为什么子对象中的父对象的值为空?

Java 为什么子对象中的父对象的值为空?,java,hibernate,jpa-2.0,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")

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

配置信息: 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);
    }

}
最后是一个非常简单的测试:

@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());
}
@测试
public void testSaveOrUpdate(){
投票表决1=新的投票表决();
vote1.setAddress(InetAddress.getLocalHost());
vote1.setMode(Mode.HIM);
问题=新问题();
问题.设置标题(“测试”);
问题.说明(“测试”);
问题.补充投票(第1次投票);
question2=questionDao.saveOrUpdate(问题);
assertNotNull(问题2);
设置投票=问题。获取投票();
assertEquals(vots.size(),1);
赞成(表决:票)
assertNotNull(vote.getQuestion());
}

测试失败,因为vote.getQuestion()返回null。当我签入DB时,questionId列中有null。我的问题是,我应该怎样做才能在投票中提到问题?映射有问题,但我不知道是什么。

在所有关系中都有一个拥有方(至少在ORM中)。在多对一的情况下,你作为拥有方进行了投票。这意味着,将自己与问题联系起来是投票的依赖。因此,question.addVote(vote1)将不起作用,但vote.setQuestion(question)将使一切都起作用。投票是拥有投票权的一方,正如您在这一侧声明的JoinColumn和在问题一侧声明的mappedBy字段


编辑:现在应该保留投票对象,而不是问题对象以产生任何效果。

如果在保留之前显式调用vote.setQuestion(..),会发生什么?获取StackOverflowException,因为实体管理器将循环引用并生成无限循环插入。真的吗?我必须说,这对我来说是不自然的。然后我应该坚持投票而不是质疑?编辑..在那里,做到了。仔细阅读文档,开源人员使用非常小的字体编写:p问题不在于阅读。。。问题是要知道我想做什么。thx的帮助。我非常诚实的建议,从我这边作为一名工程师,阅读尽可能多的设计原则和模式,你会知道什么时候做。优化是下一步。愿原力与你同在:D
@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());
}