2010-11-12 50 views
1

在App Engine的JDO實現中,對象類型與持久化到數據存儲的實體一起保存爲'Kind'。當這些實體從數據存儲中取回時,它們將作爲原始對象類型自動返回(在某個JDO層中)。令我困惑的是,只有班級的簡單名字纔會被保存;不是完整的路徑。那麼JVM如何加載正確的類?GAE/JDO如何將實體轉換爲域對象?

例如,如果我有com.project.domain.User,並且將此類的一個實例保存到數據存儲中,則只會爲實體類型定義「用戶」。當我使用JDO來選擇這個數據時,我得到一個com.project.domain.User。 GAE/JDO如何知道加載com.project.domain.User而不是com.project.other.domain.User?

回答

2

您的JDO提供者(GAE實際上並未涉及此等式)保留了實體到表的內部映射。有時它會從各種xml文件中形成,有時它通過註釋形成它(取決於您的編碼風格)。在這個映射表中,表名實際上映射到完全限定的類。

如果你存儲兩種類型的User對象,那麼JDO會給你一個異常,因爲他們會使用同一個表。你可以通過指定一個不同的表格(通過註釋或XML配置)來解決這個問題。這個規範將進入JDO的內部映射。然後JDO會知道如何正確解析實體。

+0

那麼這個內部映射如何在JVM啓動/關閉之間持久?我還沒有定義任何XML或註釋。 – Brad 2010-11-12 05:00:48

+1

因爲「JDO提供者」是GAE(或者更確切地說是他們的DataNucleus插件),所以GAE參與其中。如果您想解決這個問題,可以通過http://code.google.com/p/datanucleus-appengine/source/browse/trunk/src/org/datanucleus/store/appengine/DatastorePersistenceHandler.java – DataNucleus 2010-11-12 08:20:22