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 属性。

这样做是不是有点疯狂?开发商有什么意见吗?

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 回答