Quelle est la meilleure façon de gérer les clés composites lors de l'utilisation de Salat avec MongoDB?
Question
J'utilise Salat avec MongoDB et j'essaie de convertir en clés naturelles pour éviter les doublons dans la base de données.La classe de cas que j'utilise ressemble un peu à:
case class Foo(someRelatedId: String, email: String ...)
Je voudrais ajouter une clé naturelle qui se compose de someRelatedId + email et que MongoDB l'utilise à la place de l'ObjectId par défaut.D'après la documentation, j'ai l'impression que c'est possible, mais je cherche toujours une solution qui fonctionne.C'est en grande partie dû à mon manque de maîtrise de Scala lui-même, j'en suis sûr.
Mise à jour: j'ai une solution qui fonctionne maintenant, mais je me demande toujours si c'est la meilleure façon de procéder
case class Foo(someRelatedId: String, email: String, naturalKey: String)
object Foo {
def apply((someRelatedId: String, email: String) {
apply(someRelatedId, email, someRelatedId+email)
}
}
Et puis dans package.scala, je mappe à un contexte de salat personnalisé :
implicit val ctx = new Context() {
val name = Some("Custom Context")
}
ctx.registerGlobalKeyOverride(remapThis = "naturalKey", toThisInstead = "_id")
De cette façon, j'évite d'avoir un champ _id obligatoire (sans signification) dans mes classes de domaine, mais je dois surcharger apply () sur l'objet compagnon, ce qui semble un peu maladroit.
La solution
développeur principal de Salat ici.
Comme Milan l'a suggéré, créez une classe de cas pour votre clé composite:
case class FooKey(someRelatedId: String, email: String)
case class Foo(@Key("_id") naturalKey: FooKey) {
// use @Persist if you want these fields serialized verbatim to Mongo - see https://github.com/novus/salat/wiki/Annotations for details
@Persist val email = naturalKey.email
@Persist val someRelatedId = naturalKey.someRelatedId
}
object FooDAO extends SalatDAO[Foo, FooKey](collection = /* some Mongo coll */ )
Si vous vous opposez à "_id" comme nom de champ, vous pouvez utiliser un remplacement global dans le contexte pour remapper "_id" en "naturalKey", ou fournir des remplacements ad hoc @Key sur chaque objet.
Personnellement, je n'aime pas donner un nom différent à _id dans vos modèles, car vos requêtes Mongo doivent utiliser la clé sérialisée "_id" alors que toute votre logique métier doit utiliser le nom du champ de classe de cas ("naturalKey" ou autre), mais YMMV.
P.S.Notre liste de diffusion se trouve à l'adresse http://groups.google.com/group/scala-salat - je vaisvoir votre question plus rapidement que Stack Overflow.