2012-08-07 53 views
2

刪除時,我一直在使用JDO 3.0語法定義無主的關係:JDO在AppEngine上:保持原有的實體無主從關係

@Persistent 
@Unowned 
private Set<Role> roles; 

我有應分配給用戶的幾個預定義角色。我用下面的代碼添加/刪除角色分配給用戶:

roles.add(roleEntity); 
roles.remove(roleEntity); 

的問題是,去除這樣也從數據庫中刪除原來的實體,但我只是想刪除引用。我知道我只能在父實體中存儲能夠解決問題的Keys,但有沒有更好的解決方案?使用這種「自然」的語法?

+0

AFAIK,無主的關係從不依賴,所以這不應該發生。如果你的'Role'是序列化的('@Persistent(serialized = true)')或嵌入的('@ Embedded'),OTOH可能會發生。 – 2012-08-07 11:48:50

+0

角色既沒有序列化也沒有嵌入。這是角色實體的代碼http://pastebin.com/ZRLNhiWm ...沒什麼特別的。 – tobik 2012-08-07 12:14:57

+1

一個無主關係可以依賴或不依賴於基於標準級聯刪除設置...對於GAE或任何數據存儲區...顯然存在任何問題的不完整定義 – 2012-08-07 13:27:44

回答

0

我想這個問題值得一個真正的最終答案。

描述的行爲是由JDO中的錯誤引起的,現在應該修復它。有關更多詳細信息,請參閱http://code.google.com/p/datanucleus-appengine/issues/detail?id=290。另外請注意,owned關係是總是dependent,不管文檔說什麼。

不幸的是,在我搬回JDO 2.0後,它被修復了。在JDO 2.0中,我使用​​或使用foreign keys實現了unowned關係。實際上這不是一個糟糕的解決方案,所以我不打算再次嘗試JDO 3.0。對於密鑰集合,我使用batch fetch來獲取子對象,如果是外鍵,我使用where語句的簡單查詢。有時最好使用第一種解決方案,有時使用第二種解決方案。無論如何它都覆蓋了一個乾淨的API,所以最終的代碼很簡單並且是「自然的」。 (我想這種做法是直接在文檔中描述的,所以我們不必去學習它的艱辛的道路。)

重要的是,在這兩種情況下,我可以不破壞原來刪除實體之間的關係。這是一個真實的關係。

2

我看到同樣的事情。當然,我是一個新手,但即使有@Unnow ,如果我從ArrayList中刪除一個項目時,它首次持續存在, 對象將從數據存儲中刪除。看起來和我之前添加的 @Unnow一樣。因此,我可以將對象從一個對象 的ArrayList轉移到另一個對象的唯一方法是在調用remove()之前先找到它,然後進行深度複製,然後我可以移除()並將該副本放在其他名單。一點都不自然。

1

正如我這個奮鬥的年齡,讓我分享finaly對我的作品的解決方案。誰知道,它可能會幫助別人作爲資料的主要不是非常有幫助。

要從父集合的子而不刪除原有persitent對象,你需要:

1)使用不是List

起初我只用列表,A)爲排序和B),因爲設置+ RequestFactory ValueProxy不起作用。所以一定要使用EntityProxy

2)Anotate這一套與@Unowned

他們沒有把這個註釋在他們的無主的一個一對多例如:https://developers.google.com/appengine/docs/java/datastore/jdo/relationships#Unowned_Relationships 但是沒有它,你得到一個例外,當你嘗試的元素添加到您的設置(不能改變父)

3)不知道這是必要的,但我也標註了@Element(取決於=「假」)

希望這會幫助一些人。如果沒有,那麼沒有傷害。

+0

謝謝!我無法想象如果我使用List或Set,它會產生任何影響,但實際上它確實如此。感謝你,我解決了更新父實體導致重複條目的問題,因爲它認爲子實體不存在,即使它們已經存在。 這很奇怪Google Docs沒有提到Set在某些情況下是必須的。而那個失蹤的@未知者困擾着我,因爲我不知道我需要它!你也會發現是否可以使用SortedSet? 再次感謝! – Whyser 2014-01-30 09:04:41

+0

你好, 非常歡迎,我很高興我可以提供幫助。 :) 關於SortedSet,還沒有嘗試過它在一個無主的關係。我的猜測是它應該有效,只要你提供一個比較器,但你永遠不知道。測試它不應該花很長時間。 – glouton 2014-01-31 12:55:59

相關問題