2012-05-04 6 views
4

私の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))); 
    } 
} 
+1

、2つの迅速なアイデア、私はのDAOを使用していない(したがって、何の '' findOne''はありません)間: 1)Morphia 2にかなりいくつかの問題を修正0.99.1-SNAPSHOTを、試してみてください)試してみてくださいclientId内のStringの代わりにObjectIdを渡します。少なくとも私のDAOレスコードでは、ObjectIdの代わりにStringを渡すオプションさえありません。さもなければ、これは我々が正常に使用しているコードによく似ています... – xeraa

+0

すべての@Idsを '' @Id private ObjectId id; ''に置き換えましたか? – xeraa

+0

今のところ私はObjectIdに切り替えましたが、テクニカルリーダーは可能な限り早くStringを使用するように私に求めました。だから私はまだ解決策に興味があります。 –

答えて

6

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

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

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

これが役に立ちます。

+1

しかし、重複したIDに問題が生じる可能性はありますか? –

+3

これ以上idとしてObjectId()を使用することはありません。私はコードを見て、IDは、タイムスタンプ、デバイス固有のIDと静的カウンタを取ることによって生成されます。私にとっては、それを使うのはかなり退屈です。 – Arne

1

少し違っていましたので、IDをRESTリクエストのパスパラメータとして使用できます。

@Id 
private String id = new ObjectId().toHexString(); 
関連する問題