我正在寻找关于模型的最佳实践以及使用play 2.0在数据库中持久保存对象的方法。我已经使用scala研究了Play和类型安全样本for play 2.0。
我的理解是:
因此,如果我需要更新我的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的了解很少。
答案 0 :(得分:4)
我认为部分原因是在Scala等函数式语言中支持不变性。
在您的示例中,您修改'this.owner'。对于删除,你的等效操作是什么样的?“这个”会发生什么?
使用伴随对象,似乎更清楚的是传递的对象(或ID)未被修改,返回的对象或ID是操作的相关结果。
然后,我认为问题的另一部分是你的例子首先需要一个实例。当你删除一个对象时,如果你只是想通过Id删除一个表单,并且不想首先构建你想要删除的对象的整个实例,该怎么办?
我一直在用mongo玩play2.0,我的伴侣对象看起来像:
对象MyObject扩展SalatDAO [MyObject,ObjectId](collection = getCollection(“objectcollection”)){ }
这些伴随对象从SalatDAO(MyObject.save(),MyObject.find()等继承CRUD操作。我并不完全清楚它是如何在内部实现的,但是效果很好。