私のMongoDBにはクライアントとコードという2種類のドキュメントがあります。各コードは1つのクライアントを参照します。クライアントは明示的に管理者によって保管されなければならないので、それらを別々に保管しなければならず、コード文書に入れることができません。MongoDB/MorphiaはTechnical IdをObjectIdとして保存しますが、JavaのStringです
code -> client
今のMongoDB/Morphiaは、コードが、String型の技術IDとクライアントを参照して、一方のObjectIdとしてクライアントの技術IDを保存します。私は特定のクライアントIDでコードを検索することができますが、実行時には、Morphiaがクライアントを注入できないため、エラーメッセージが表示されます。私はそれが異なるidの種類のためだと仮定します。
code { client.$id: String }
client { _id: ObjectId }
これを修正する方法はありますか?
例外
com.google.code.morphia.mapping.MappingException:参照({ "$ refを": "クライアント"、 "$番号": "123456789abcdef"})取り出すことができませんでしたfor 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)));
}
}
、2つの迅速なアイデア、私はのDAOを使用していない(したがって、何の '' findOne''はありません)間: 1)Morphia 2にかなりいくつかの問題を修正0.99.1-SNAPSHOTを、試してみてください)試してみてくださいclientId内のStringの代わりにObjectIdを渡します。少なくとも私のDAOレスコードでは、ObjectIdの代わりにStringを渡すオプションさえありません。さもなければ、これは我々が正常に使用しているコードによく似ています... – xeraa
すべての@Idsを '' @Id private ObjectId id; ''に置き換えましたか? – xeraa
今のところ私はObjectIdに切り替えましたが、テクニカルリーダーは可能な限り早くStringを使用するように私に求めました。だから私はまだ解決策に興味があります。 –