4

MongoDBには、クライアントとコードの2種類のドキュメントがあります。各コードは1つのクライアントを参照します。クライアントは管理者が明示的に保存する必要があるため、個別に保存する必要があり、コードド​​キュメントに入れることはできません。

code -> client

現在、MongoDB / MorphiaはクライアントのテクニカルIDをObjectIdとして保存しますが、コードはタイプStringのテクニカルIDを持つクライアントを参照します。指定されたクライアントIDでコードを検索できますが、Morphiaがクライアントを挿入できないため、実行時にエラーメッセージが表示されます。IDタイプが異なるためだと思います。

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

これを修正する方法はありますか?

例外

com.google.code.morphia.mapping.MappingException:参照({"$ ref": "clients"、 "$ id": "123456789abcdef"})をorg.example.Code.clientに対してフェッチできませんでした

インターネット上で、その例外メッセージを見つけました。モデルではStringの代わりにObjectIdを使用することが提案されましたが、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)));
    }
}
4

2 に答える 2

6

これがまだ解決されているかどうかはわかりません。私も同じ問題を抱えていました。私にとっての解決策は、自分でIDを設定することでした。

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

これで、idフィールドを他の文字列フィールドと同じように扱うことができます。

お役に立てれば。

于 2012-05-27T11:05:07.267 に答える
1

私はそれを少し違ったやり方で行ったので、RESTリクエストでパスパラメータとしてIDを使用できました。

@Id
private String id = new ObjectId().toHexString();
于 2015-10-01T22:53:07.320 に答える