MongoDB / Morphia将技术ID保存为ObjectId,尽管它是Java中的String

我的MongoDB中有两种文档:客户端和代码。 每个代码都指一个客户端。 客户端必须由管理员显式存储,因此我必须将它们分开存储,并且不能将它们放入代码文档中。

code -> client 

现在MongoDB / Morphia将客户端的技术ID保存为ObjectId,而代码引用技术ID为String类型的客户端。 我能够通过给定的客户端ID搜索代码,但在运行时我会收到一条错误消息,因为Morphia无法注入客户端。 我认为这是因为不同的id类型。

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

任何想法如何解决这一问题?

例外

com.google.code.morphia.mapping.MappingException:无法为org.example.Code.client获取引用({“$ ref”:“clients”,“$ id”:“123456789abcdef”})

在互联网上我发现了exception消息。 有人建议在模型中使用ObjectId而不是String,但我需要使用String。 这不是我自己的项目。

实体:

 @Entity("codes") public class Code implements Comparable { @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 { [... 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.class, clientId))); } } 

不确定这是否已经解决。 我有同样的问题。 我的解决方案是自己设置id。

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

现在,您可以将id字段视为任何其他字符串字段。

希望这可以帮助。

我的做法略有不同,所以我可以在REST请求中使用id作为路径参数。

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