2017-04-05 32 views
0

現在當我添加一個questionAnswer對象並堅持它時,我有廣告和QuestionAnswers之間的一對多關係我看到在QuestionAnswers中插入,但我添加的對象不改變它的ID。OneToMany關係不會更新添加的對象的ID

在advertisement.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("[email protected]"); 
    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()); 


} 

不知道發生了什麼

回答

0

據我所知,當PE rsisting @OneToMany通過級聯插入(當新項添加到集合時)hibernate(如果Hibernate用作JPA提供程序)實際上會創建QuestionAnswers類的新實例,並將您添加到Advertisement.questions集合中的那個實例替換爲集合。這個實例實際上有一個ID。您可以通過advertisementRepository.save(adv);之後的調試器檢查Advertisement.questions集合來確認此情況。您應該看到下面的圖片包含的Advertisement.questions

  1. QuestionAnswers實例已經產生的ID,並在其上設置
  2. 你的QuestionAnswers的實例實際上是一個不同的實例,然後在Advertisement.questions
  3. 包含一個確保僅在執行advertisementRepository.save(adv);後才能檢查狀態

可能的替代方案可能是試圖找到在保存完成後(只要您有一種方法可以使用其他字段唯一標識它),在Advertisement.questions集合內的10個。

希望這會有所幫助。