Quelle est la meilleure façon de gérer les clés composites lors de l'utilisation de Salat avec MongoDB?

StackOverflow https://stackoverflow.com/questions/8882797

  •  29-10-2019
  •  | 
  •  

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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top