我正在寻找关于模型和使用 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 类本身中:
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 等函数式语言的不变性。
在您的示例中,您修改了“this.owner”。删除的等效操作是什么样的,“这个”会发生什么?
有了伴生对象,传递过来的对象(或ID)没有被修改,返回的对象或ID就是操作的相关结果,似乎更清楚一点。
然后,我认为问题的另一部分是您的示例首先需要一个实例。当您删除一个对象时,如果您只想通过 Id 删除您从表单中删除的内容,并且不想首先构建您打算删除的对象的整个实例,该怎么办?
我一直在用 mongo 玩 play2.0,我的同伴对象看起来像:
object MyObject extends SalatDAO[MyObject,ObjectId] (collection = getCollection("objectcollection")) {
}
这些伴随对象从 SalatDAO(MyObject.save()、MyObject.find() 等)继承了 CRUD 之类的操作。我不完全清楚它是如何在内部实现的,但它运行良好。
关于scala - Play 2.0 模型最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10533225/