¿Cómo abstraigo la capa de dominio de la capa de persistencia en Scala?

ACTUALIZACIÓN: edité el título y agregué este texto para explicar mejor lo que estoy tratando de lograr: estoy tratando de crear una nueva aplicación desde el principio, pero no quiero que la capa de negocios sepa sobre la persistencia capa, de la misma manera que uno no quiere que la capa de negocios sepa acerca de una capa REST API. A continuación se muestra un ejemplo de una capa de persistencia que me gustaría usar. Estoy buscando un buen consejo para integrarme con esto, es decir, necesito ayuda con el diseño / arquitectura para dividir de manera clara las responsabilidades entre la lógica empresarial y la lógica de persistencia. Tal vez un concepto a lo largo de la línea de ordenación y despojo de objetos de persistencia a objetos de dominio.

De un SLICK (a.k.a. ScalaQuery)ejemplo de prueba, así es como se crea una relación de base de datos de muchos a muchos. Esto creará 3 tablas: a, b y a_to_b, donde a_to_b mantiene enlaces de filas en la tabla ay b.

object A extends Table[(Int, String)]("a") {
  def id = column[Int]("id", O.PrimaryKey)
  def s = column[String]("s")
  def * = id ~ s
  def bs = AToB.filter(_.aId === id).flatMap(_.bFK)
}

object B extends Table[(Int, String)]("b") {
  def id = column[Int]("id", O.PrimaryKey)
  def s = column[String]("s")
  def * = id ~ s
  def as = AToB.filter(_.bId === id).flatMap(_.aFK)
}

object AToB extends Table[(Int, Int)]("a_to_b") {
  def aId = column[Int]("a")
  def bId = column[Int]("b")
  def * = aId ~ bId
  def aFK = foreignKey("a_fk", aId, A)(a => a.id)
  def bFK = foreignKey("b_fk", bId, B)(b => b.id)
}

(A.ddl ++ B.ddl ++ AToB.ddl).create
A.insertAll(1 -> "a", 2 -> "b", 3 -> "c")
B.insertAll(1 -> "x", 2 -> "y", 3 -> "z")
AToB.insertAll(1 -> 1, 1 -> 2, 2 -> 2, 2 -> 3)

val q1 = for {
  a <- A if a.id >= 2
  b <- a.bs
} yield (a.s, b.s)
q1.foreach(x => println(" "+x))
assertEquals(Set(("b","y"), ("b","z")), q1.list.toSet)

Como misiguiente paso, me gustaría subir esto un nivel (todavía quiero usar SLICK pero envolverlo bien), para trabajar con objetos. Así que en el pseudo código sería genial hacer algo como:

objectOfTypeA.save()
objectOfTypeB.save()
linkAtoB.save(ojectOfTypeA, objectOfTypeB)

O algo así. Tengo mis ideas sobre cómo podría abordar esto en Java, pero estoy empezando a darme cuenta de que algunas de mis ideas orientadas a objetos de lenguajes OO puros están empezando a fallar. ¿Puede alguien, por favor, darme algunos consejos sobre cómo abordar este problema en Scala?

Por ejemplo: ¿creo objetos simples que simplemente envuelven o extienden los objetos de la tabla y luego los incluyo (composición) en otra clase que los administra?

Cualquier idea, orientación, ejemplo (por favor), que me ayude a abordar mejor este problema como diseñador y programador serán muy apreciados.

Respuestas a la pregunta(2)

Su respuesta a la pregunta