OneToMany关系不会更新添加的对象的ID

时间:2017-04-05 12:02:47

标签: spring-data spring-data-jpa

我在广告和QuestionAnswers之间有一对多的关系,现在当我添加一个questionAnswer对象并坚持它时,我看到插入是在QuestionAnswers中进行的,但是我添加的对象并没有改变它的id。

在advert.java中

@OneToMany(mappedBy = "advertisement", cascade = CascadeType.ALL)
public List<QuestionAnswers> getQuestionAnswers() {
    return questionAnswers;
}
在questionanswer.java中

@ManyToOne
@JoinColumn(name = "advertisement_id")
public Advertisement getAdvertisement() {
    return advertisement;
}

测试用例

public void testAddQA(){
    User user=userRepository.findByEmail("abc@gmail.com");
    Advertisement adv=new Advertisement();
    adv.setAdvertisementStatus(statusRepository.findByStatus("A"));
    adv.setMaximumPrice(new BigDecimal(12));
    adv.setDescription("blabla");
    adv.setAdvertiser(user);
    advertisementRepository.save(adv);

    QuestionAnswers ans=new QuestionAnswers();
    ans.setAdvertisement(adv);
    ans.setQuestion("blabla");
    ans.setQuestionDate(new Date());
    ans.setBidder(user);
    adv.addQuestions(ans);

    advertisementRepository.save(adv);
    assertNotNull(ans.getId());


}

不确定发生了什么

1 个答案:

答案 0 :(得分:0)

据我所知,当通过级联插入持久化@OneToMany时(当新项添加到集合中时)hibernate(如果Hibernate被用作JPA提供者)实际上创建了{的新实例{1}}类并替换您添加到QuestionAnswers集合中的类。这个实例实际上有一个ID。您可以在Advertisement.questions之后通过调试器检查Advertisement.questions集合来确认这一点。您应该看到以下图片

    {li> advertisementRepository.save(adv); QuestionAnswers中包含的实例已生成并设置了ID
  1. Advertisement.questions的实例实际上是与QuestionAnswers
  2. 中包含的实例不同的实例
  3. 确保仅在Advertisement.questions执行后检查状态
  4. 可能的替代方法是在保存完成后尝试在advertisementRepository.save(adv);集合中找到QuestionAnswers(只要您有办法使用其他字段唯一标识它)。

    希望这有帮助。