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();