2011-10-27 60 views
6

我對OneToMany字段的持久性有困難。這些是我用來測試的兩個簡化類 。Jpa OneToMany不會堅持孩子

public class User implements Serializable { 
... 
private String name; 
... 
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL) 
private List<PhoneNumber> phoneNumbers; 
... 
} 

public class PhoneNumber implements Serializable { 
... 
private String phoneNumber; 
... 
@ManyToOne() 
private User user; 
... 
} 

所以我想這樣做:

User u = new User(); 
PhoneNumber p = new PhoneNumber(); 
u.setName("Alan"); 
u.getPhoneNumbers.add(p); 

但是,當我堅持用戶U的phoneNumber的孩子是不是自動持久。在OO方式中,我只需要做一對多的組合。

我使用EclipseLink。

非常感謝大家的提示。

+0

它還挺奇怪的 - 這樣的例子工程在我的情況(的EclipseLink)的罰款。最後,你只是EntityManager#堅持(U)? 你怎麼知道這個值沒有被持久化 - 在數據庫中檢查或以某種方式查詢實體?你嘗試刷新EntityManager嗎? –

回答

2

您需要在兩個方向上建立關係。添加p.setUser(u)到您的代碼:

User u = new User(); 
PhoneNumber p = new PhoneNumber(); 
u.setName("Alan"); 
u.getPhoneNumbers.add(p); 
p.setUser(u); 
+0

您確定必須設置兩個方向才能保留PhoneNumber實體嗎? –

+0

@Pedro如果它是一個雙向關係(如問題代碼片段所示):是的。 –

+2

是否因爲PhoneNumber是關係的反面? 我已經成功地堅持了上面談到的結構而沒有設置關係的第二面。 PhoneNumeber.user設置爲空,但是它成功保存。 看看在JPA 2.0規範3.2.4「管理實體間的雙向關係將基於關係的擁有方持有的引用依然存在。這是開發商的責任,保持對所屬舉行的內存引用側面和那些當他們改變」 –