2012-05-10 65 views
5

我正在尋找有關使用Play 2.0在數據庫中堅持對象的模型和方法的最佳做法。我已經使用scala研究了play 2.0和typesafe樣本。播放2.0模型的最佳做法

我的理解是:

  • 該模型的情況下類
  • 所有插入/更新定義/刪除/選擇在這種情況下類的同伴對象定義

所以,如果我需要更新我的車對象定義一個新的老闆,我必須做的:

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

我很奇怪,爲什麼UPDATE或DELETE語句都沒有的情況下類本身:

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) 

這是我使用播放1做。 X使用Java和JPA。 也許原因是顯而易見的,由於我對Scala知之甚少。

回答

4

我認爲部分原因是在Scala等函數式語言中支持不變性。

在你的例子中,你修改'this.owner'。什麼是您的等效操作看起來像刪除,以及「this」會發生什麼?

對於伴隨對象,似乎更清楚的是傳遞的對象(或ID)未被修改,並且返回的對象或ID是操作的相關結果。

然後,我認爲問題的另一個部分是您的示例首先需要一個實例。當你刪除一個對象時,如果你只想通過Id刪除你的表單,並且不想首先構建你打算刪除的對象的整個實例?

我一直在玩與蒙戈play2.0,和我的同伴對象的樣子:

對象MyObject來擴展SalatDAO [MyObject來,的ObjectId(集合= getCollection( 「objectcollection」)){}

這些伴隨對象從SalatDAO(MyObject.save(),MyObject.find()等)繼承CRUD類似的操作。我不完全清楚它是如何在內部實現的,但它很好地工作。