Eu tive a mesma preocupação apenas alguns dias atrás, mas não encontrei nada na documentação sobre
sealed traits
para modelar ADT no MongoDB. No final, usei
sealed class
conforme sugerido no oficial repositório do github do driver scala
. Se você realmente deseja usar traits (devido à definição de métodos abstratos), pode fazer algo assim:
package example.model
import example.model.adt._
import org.mongodb.scala.bson.ObjectId
import org.mongodb.scala.bson.codecs.Macros._
import org.mongodb.scala.bson.codecs.DEFAULT_CODEC_REGISTRY
import org.bson.codecs.configuration.CodecRegistries.{fromProviders, fromRegistries}
trait MongoModel {
def _id: ObjectId
}
object MongoModel {
val codecRegistery = fromRegisteries(fromProviders(classOf[A]), DEFAULT_CODEC_REGISTRY)
}
Agora você pode ter seu ADT para A definido com
sealed class
. package example.model.adt
import example.model.MongoModel
import org.mongodb.scala.bson.ObjectId
sealed class A
final case class B(_id: ObjectId) extends A with MongoModel
final case class C(_id: ObjectId) extends A with MongoModel
Esta resposta não resolve a questão diretamente, mas fornece uma solução viável. Observe que este código é apenas um exemplo. Para uma implementação mais completa, você pode ver este repositório do github .