2012-05-10 14 views
5

私は、演劇2.0でデータベース内のオブジェクトを永続化するためのモデルと方法に関するベストプラクティスを探しています。私は、Play 2.0とscalaを使ってタイプセーフなサンプルを研究しました。Play 2.0モデルのベストプラクティス

私が理解することです:

  • モデルは、このケースクラスのコンパニオンオブジェクトで定義されている選択/削除/ケースクラス
  • すべての挿入/更新で定義されている
私は私の車のオブジェクトを更新する必要がある場合は、新しい所有者を定義するので

私が行う必要があります:

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) 

私がプレイ1で行うために使用するものはどれ。 XはJavaとJPAを使用しています。 多分、その理由は明らかで、私のScalaの知識が少ないためです。

答えて

4

私は、スカラのような機能的な言語で不変性を好む理由の一部を考えています。

あなたの例では、 'this.owner'を変更します。あなたの同等の操作は削除のように見えますが、「これ」はどうなりますか?

コンパニオンオブジェクトでは、渡されたオブジェクト(またはID)が変更されておらず、返されたオブジェクトまたはIDが操作の関連する結果であることがもう少しわかります。

また、問題の別の部分は、あなたの例が最初にインスタンスを必要とすることです。オブジェクトを削除すると、フォームから降りたIDで削除したいだけで、削除するオブジェクトのインスタンス全体を最初に構築したくない場合はどうすればよいでしょうか?私はモンゴでplay2.0でプレーしてきた、と私のコンパニオンオブジェクトは次のようになり

オブジェクトMyObjectにはSalatDAO [MyObjectに、のObjectId](収集= getCollection( "objectcollection")){ }

を拡張します

これらのコンパニオンオブジェクトは、SalatDAO(MyObject.save()、MyObject.find()などからのCRUDのような操作を継承します。私はそれが内部的にどのように実装されているかについて完全には分かりませんが、うまく機能します。

関連する問題