【问题标题】:Play 2.0 models best practicesPlay 2.0 模型最佳实践
【发布时间】:2012-05-18 23:30:55
【问题描述】:

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

我的理解是:

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

因此,如果我需要更新我的 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 了解不多。

【问题讨论】:

    标签: scala model playframework playframework-2.0


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-18
      • 2014-07-05
      相关资源
      最近更新 更多