2012-05-04 32 views
4

我在MongoDB中有兩種文檔:客戶端和代碼。每個代碼都涉及一個客戶端。客戶必須由管理員明確存儲,因此我必須將它們分開存儲並且不能將它們放入代碼文檔中。MongoDB/Morphia將技術ID保存爲ObjectId,儘管它是Java中的字符串

code -> client 

現在的MongoDB /嗎啡節省客戶的的ObjectId技術IDS,而代碼是指客戶類型爲String的技術ID。我能夠通過給定的客戶端ID來搜索代碼,但在運行時我會收到錯誤消息,因爲Morphia無法注入客戶端。我認爲這是因爲不同的id類型。

code { client.$id: String } 
client { _id: ObjectId } 

任何想法如何解決這個問題?

異常

com.google.code.morphia.mapping.MappingException:參考({ 「$ REF」: 「客戶端」, 「$標識」: 「123456789abcdef」})不能取對於org.example.Code.client

在互聯網上我發現了異常消息。建議在模型中使用ObjectId而不是String,但我有使用String的要求。這不是我自己的項目。

實體:

@Entity("codes") 
public class Code implements Comparable<Code> { 
    @Id 
    private String id; 

    @Reference 
    private Client client; 

    [...] 
} 

@Entity("clients") 
public class Client { 
    @Id 
    private String id; 
} 

存儲:

要保存我使用com.google.code.morphia.dao.DAO.save(T entity)的對象。

搜索:

public class CodeRepository extends BasicDAO<Code, String> { 
    [... constructor ...] 

    @Override 
    public Code findByCode(String type, String clientId, String code) { 
     return findOne(createQuery() 
       .field("type") 
       .equal(type) 
       .field("value") 
       .equal(code) 
       .field("client") 
       .equal(new Key<Client>(Client.class, clientId))); 
    } 
} 
+1

雖然我不使用的DAO(因此沒有''findOne''),2點快的想法: 1)嘗試0.99.1-快照,它修復了嗎啡 2頗有些問題)試試在clientId中傳遞ObjectId而不是String。至少在我的無DAO代碼中,甚至沒有傳遞字符串而不是ObjectId的選項。否則,這看起來很像我們成功使用的代碼... – xeraa

+0

你用@Id private ObjectId id替換了所有的@Ids ID嗎? – xeraa

+0

現在我切換到ObjectId,但技術負責人要求我儘快使用Strings。所以我仍然對解決方案感興趣。 –

回答

6

如果這還解決了不知道。我有同樣的問題。對我來說,解決方案是自己設置ID。

@Id 
private String id = new ObjectId().toString(); 

現在,您可以像處理任何其他字符串字段一樣對待id字段。

希望這會有所幫助。

+1

但我可以得到重複的ID的問題,不是嗎? –

+3

不再比使用ObjectId()作爲id。我查看了代碼,並通過獲取時間戳,設備特定的id和靜態計數器生成了id。對我來說,使用它看起來相當省力。 – Arne

1

我做得稍微不同,所以我可以在REST請求中使用id作爲路徑參數。

@Id 
private String id = new ObjectId().toHexString(); 
相關問題