我在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)));
}
}
雖然我不使用的DAO(因此沒有''findOne''),2點快的想法: 1)嘗試0.99.1-快照,它修復了嗎啡 2頗有些問題)試試在clientId中傳遞ObjectId而不是String。至少在我的無DAO代碼中,甚至沒有傳遞字符串而不是ObjectId的選項。否則,這看起來很像我們成功使用的代碼... – xeraa
你用@Id private ObjectId id替換了所有的@Ids ID嗎? – xeraa
現在我切換到ObjectId,但技術負責人要求我儘快使用Strings。所以我仍然對解決方案感興趣。 –