2013-04-28 43 views
0

我有我的項目中數據庫的以下問題,我不知道是什麼原因造成:持久性管理器不能保存所有數據

有下面的類層次:一個

類 - 有一個嵌入式 B類實例 B類 - 有2個嵌入式 C類實例(我重命名了其中一個的字段)。 C類 - 只有簡單的字段。

我知道,當你使用持久性管理器從數據庫中獲取對象時,一些字段可以被懶惰地取回,因此我必須使用getter訪問它們。我已經這樣做了,它適用於所有其他情況。然而,在這種情況下,當我獲取類A時,類B被正確提取,但是類C(他在B類中的兩個實例)都爲null,並且即使在持久性管理器仍處於打開狀態時嘗試訪問它們,它們仍然爲空。另外,如果我向B添加簡單字段,它們似乎也會變爲空值。這讓我相信這些實例根本就沒有保存。

這裏有什麼問題?我真的迷失了。

+0

查看日誌,明確打印PUT語句,將意味着您不必猜測 – DataNucleus 2013-04-29 04:48:58

回答

0

是否可以存儲空值?大多數ORM工具無法區分嵌入對象爲空和嵌入對象爲非空,只有空值爲字段。例如,hibernate會將嵌入對象解釋爲null。你可以存儲一個虛擬字段來解決這個問題,或者你的持久化提供者有一些註釋讓你覆蓋默認行爲

+0

不,我確定我沒有存儲空值。 – 2013-04-28 18:33:41

+0

可以請您發佈代碼。 – cproinger 2013-04-28 20:32:03

0

在@Embedded情況下,所有的數據都存儲在同一級別,因此例如,如果您的B類擁有一個道具b,它將以A的形式命名,如A_B_b(想想company_manager_firstName,如果您的經理是Manager1或Manager2,則無關緊要)

既然您擁有兩個同類的嵌入式實例,持久性管理器無法弄清楚兩個C實例之間的區別。如果你在A中使用B的兩個實例,問題也會一樣。

解決方法是在C實例之一上使用@AttributeOverrides註釋,這將告訴JPA如何區分Cs。

- 希望這會有所幫助。

+0

我試圖添加虛擬字段到B類,並且它似乎也變成了0.我已經做了@AttributeOverrides – 2013-04-28 18:42:29

+0

可以請你確認你是否正在做屬性覆蓋,第二個答案[這裏](http:///stackoverflow.com/questions/4432748/what-does-attributeoverride-mean)可能會有所幫助,您將不得不爲其中一個C屬性中的每個字段覆蓋它。 – skywalker 2013-04-28 18:50:25

相關問題