数据库
首页 > 数据库> > MongoDB / Morphia将技术ID保存为ObjectId,尽管它是Java中的String

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”})

在互联网上我发现了异常消息.有人建议在模型中使用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)));
    }
}

解决方法:

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

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

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

希望这可以帮助.

标签:java,mongodb,morphia
来源: https://codeday.me/bug/20190613/1233395.html