2012-05-10 10 views
5

Busco mejores prácticas en materia de modelos y formas de persistencia de objetos en la base de datos con el juego 2.0. Estudié el juego y las muestras de tipo seguro para jugar 2.0 usando Scala.2.0 modelos de mejores prácticas

Lo que entiendo es:

  • El modelo se define en una clase de caso
  • Todo el inserto/actualizar/borrar/select se definen en el objeto acompañante de esta clase caso

Así que si tengo que actualizar mi objeto de coches para definir un nuevo propietario voy a tener que hacer:

val updatedCar = myCar.copy(owner=newOwner) 
Car.update(updatedCar) 
// or 
Car.updateOwner(myCar.id.get, newOwner) 

Me pregunto por qué la actualización o eliminar declaraciones no están en la misma clase de caso:

case class Car(id: Pk[Long] = NotAssigned, owner: String) { 
    def updateOwner(newOwner: String) { 
     DB.withConnection { implicit connection => 
      SQL(
       """ 
       update car 
       set owner = {newOwner} 
       where id = {id} 
       """ 
      ).on(
       'id -> id, 
       'newOwner -> newOwner 
      ).executeUpdate() 
     } 
     copy(owner = newOwner) 
    } 
} 

Si lo hace, permitiría hacer:

val updatedCar = myCar.updateOwner(newOwner) 

Que es lo que solía hacer con Play 1. X usando Java y JPA. Quizás la razón sea obvia y debido a mi pequeño conocimiento de Scala.

Respuesta

4

Creo que parte de la razón es el favorecimiento de la inmutabilidad de los lenguajes funcionales como Scala.

En el ejemplo, modificará 'this.owner'. ¿Cuál es su operación equivalente para una eliminación y qué le sucede a "esto"?

Con un objeto acompañante, parece un poco más claro que el objeto pasado (o ID) no se modifica, y el objeto o ID devuelto es el resultado relevante de la operación.

Entonces también, creo que otra parte del problema es que su ejemplo se requiere una instancia en primer lugar. Cuando eliminas un Objeto, ¿qué sucede si solo deseas eliminar por Id y has terminado un formulario y no quieres crear primero una instancia completa del objeto que deseas eliminar?

He estado jugando con play2.0 con mongo, y mi compañero de objetos se ven como:

objeto MiObjeto extiende SalatDAO [MiObjeto, OBJECTID] (colección = getCollection ("objectcollection")) {}

Estos objetos complementarios heredan CRUD operaciones similares de SalatDAO (MyObject.save(), MyObject.find(), etc.). No estoy del todo claro sobre cómo se implementa internamente, pero funciona muy bien.