5

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

私が理解しているのは:

  • モデルはケースクラスで定義されます
  • すべての挿入/更新/削除/選択は、このケースクラスのコンパニオンオブジェクトで定義されています

したがって、Carオブジェクトを更新して新しい所有者を定義する必要がある場合は、次のことを行う必要があります。

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

なぜupdateまたはdeleteステートメントが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を使用してPlay1.Xで行っていたものです。おそらくその理由は明らかであり、Scalaに関する私の知識が少ないためです。

4

1 に答える 1

4

その理由の一部は、Scalaのような関数型言語での不変性を支持していることだと思います。

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

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

また、問題のもう1つの部分は、例で最初にインスタンスが必要になることだと思います。オブジェクトを削除するときに、Idで削除したいだけで、フォームから降りて、最初に削除しようとしているオブジェクトのインスタンス全体を構築したくない場合はどうでしょうか。

私はmongoでplay2.0で遊んでいますが、コンパニオンオブジェクトは次のようになります。

オブジェクトMyObjectはSalatDAO[MyObject、ObjectId](collection = getCollection( "objectcollection")){}を拡張します

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

于 2012-05-10T13:34:50.843 に答える