1

SORM は不変データを目指していると言われました。それはウェブサイトには書かれていません - 少なくとも私が見た主要な部分には書かれていませんでしたので、主張の厳格さに少し驚きました. そうすることをお勧めします。しかし、多分私は何かを見逃していました。

例では、オブジェクトで Db.save() を呼び出す前に「.copy(propery = newvalue)」を使用するように指示しています。ということでヒントです。

データを変更してデータベースで更新するとどうなるかに興味がありました。奇妙なことに、以下はうまくいきました:

case class Agent( var name : String )

object Db extends Instance(
  entities = Set( Entity[Agent]() ),
  url = "jdbc:h2:mem:hansi"
)

class SORMTest  extends FunSuite {
  test("Update") {
    // Store values in the db:
    val agent = Db.save( Agent("test") )

    agent.name = "hansi"
    Db.save(agent)
}

対応する ID の name プロパティを変更する update ステートメントがデータベースに作成されました。

そうするのはちょっとクレイジーですか?開発者からのコメントはありますか?

4

1 に答える 1

3

SORM は不変データを目指していると言われました。サイトには書いてない

SORM が関数型プログラミングのイディオムに強く従っていることは何度も述べられています。これは、不変のデータ構造のみに対する操作を意味します。

例では、オブジェクトで Db.save() を呼び出す前に「.copy(propery = newvalue)」を使用するように指示しています。

それはあなたが間違っているところです。例では、次のように、それが呼び出されたオブジェクトの更新された不変値を取得するために使用し、それ自体を.copy(..)呼び出す前にそれを呼び出すように指示しています。Db.save()

agent.copy(name = "new name")
Db.save(agent)

.copy() 繰り返しますが、呼び出されたオブジェクトを変更せず、代わりにこのオブジェクトの更新されたコピーを返すため、まったく効果がありません。したがって、適切な使用法は次のとおりです。

val updatedAgent = agent.copy(name = "new name")
Db.save(updatedAgent)

または単に:

Db.save( agent.copy(name = "new name") )

しかし、実際には、上記のすべてが SORM に関係するのは、Scala での関数型プログラミング全般に関係するのと同じくらいです。これは、ケース クラスの使用方法に関する非常に基本的なことです。ですから、関数型プログラミングの基礎を紹介してください。これにより、SORM に関するこれまでのすべての質問が一掃されます。また、他の方法で出てくる多くの質問も確実に解消されます。

あなたの例は機能しますが、機能するはずですが、関数型プログラミングの基本的なイディオムに反するという事実は変わりません。したがって、SORMの単義的な使用です。

于 2013-08-15T17:12:34.677 に答える