播放2.0模型的最佳实践

khe*_*aud 5 scala model playframework playframework-2.0

我正在寻找关于模型的最佳实践以及使用play 2.0在数据库中持久保存对象的方法.我已经使用scala研究了Play和类型安全样本for play 2.0.

我的理解是:

  • 该模型在案例类中定义
  • 所有insert/update/delete/select都在此case类的伴随对象中定义

因此,如果我需要更新我的Car对象以定义新的所有者,我将不得不这样做:

val updatedCar = myCar.copy(owner=newOwner)
Car.update(updatedCar)
// or
Car.updateOwner(myCar.id.get, newOwner)
Run Code Online (Sandbox Code Playgroud)

我想知道为什么更新或删除语句不在case类本身:

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

这样做可以做到:

val updatedCar = myCar.updateOwner(newOwner)
Run Code Online (Sandbox Code Playgroud)

这就是我以前使用Java和JPA对Play 1.X所做的.也许原因很明显,并且由于我对Scala的了解不多.

nai*_*rbv 4

我认为部分原因是像 Scala 这样的函数式语言对不变性的青睐。

在您的示例中,您修改“this.owner”。删除的等效操作是什么样的,“this”会发生什么?

有了伴生对象,似乎更清楚了一点,传递的对象(或ID)没有被修改,返回的对象或ID是操作的相关结果。

另外,我认为问题的另一部分是您的示例首先需要一个实例。当您删除一个对象时,如果您只想通过表单中的 Id 进行删除,并且不想首先构建要删除的对象的整个实例,该怎么办?

我一直在玩 mongo 的 play2.0,我的同伴对象看起来像:

对象 MyObject 扩展 SalatDAO[MyObject,ObjectId] (collection = getCollection("objectcollection")) { }

这些伴随对象从 SalatDAO 继承 CRUD 操作(MyObject.save()、MyObject.find() 等)。我不太清楚它的内部是如何实现的,但它工作得很好。