5

我正在寻找有关使用 play 2.0 将对象持久保存在数据库中的模型和方法的最佳实践。我已经使用 Scala 研究了 Play 2.0 的 Play 和 typesafe 示例。

我的理解是:

  • 模型在案例类中定义
  • 所有的插入/更新/删除/选择都定义在这个案例类的伴生对象中

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

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

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

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)
    }
}

这样做将允许这样做:

val updatedCar = myCar.updateOwner(newOwner)

这就是我过去使用 Java 和 JPA 对 Play 1.X 所做的事情。也许原因很明显,而且由于我对 Scala 的了解很少。

4

1 回答 1

4

我认为部分原因是喜欢 Scala 等函数式语言的不变性。

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

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

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

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

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

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

于 2012-05-10T13:34:50.843 回答