Scala 在SORM中更新数据似乎是可能的(尽管我被告知它是针对不可变数据的…)

Scala 在SORM中更新数据似乎是可能的(尽管我被告知它是针对不可变数据的…),scala,orm,sorm,Scala,Orm,Sorm,我被告知SORM的目标是不变的数据。它没有写在网站上——至少在我看到的主要部分没有,所以我有点惊讶于它的僵硬。我只是知道它会建议这样做。但也许我只是错过了什么 示例告诉您在对对象调用Db.save()之前使用“.copy(propery=newvalue)”。这是一个暗示 我被问到如果我只是改变数据并在数据库中更新它会发生什么。奇怪的是,以下几点效果很好: case class Agent( var name : String ) object Db extends Instance( e

我被告知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)
}
它在数据库中生成了一条update语句,该语句更改了相应id的name属性

这样做有点疯狂吗?开发者有什么意见吗

我被告知SORM的目标是不变的数据。网站上没有写

很多时候都说SORM非常遵循函数式编程习惯。这意味着只对不可变的数据结构进行操作

示例告诉您在对对象调用Db.save()之前使用“.copy(propery=newvalue)”

这就是你错的地方。这些示例告诉您使用
.copy(..)
获取所调用对象的更新不可变值,在调用
Db.save()之前调用它,如下所示:

agent.copy(name = "new name")
Db.save(agent)
val updatedAgent = agent.copy(name = "new name")
Db.save(updatedAgent)
将完全无效,因为,
.copy()
不会对调用它的对象进行变异,而是返回此对象的更新副本。因此,正确的使用方法如下:

agent.copy(name = "new name")
Db.save(agent)
val updatedAgent = agent.copy(name = "new name")
Db.save(updatedAgent)
或者简单地说:

Db.save( agent.copy(name = "new name") )
但事实是,上述所有内容与SORM的关系与Scala中的函数式编程的关系一样大。这是关于如何使用case类的一个非常基本的内容。所以,请帮自己一个忙,介绍一下函数式编程的基础知识。这将消除所有关于SORM的问题,我相信,还有很多其他问题


您的示例是有效的,而且应该是有效的,但它并没有改变这样一个事实,即它违背了函数式编程的基本习惯用法,因此是SORM的一种单一用法

我不喜欢你反应中咄咄逼人或恼怒的语调。你删掉了我说我可能遗漏了什么的那部分。现在,当我描述复制保存过程时,你误解了我,因为我很清楚复制不会改变旧对象的状态。我觉得我不知道是有点愚蠢。对你来说,看不到SORM旨在追求纯粹功能性风格的迹象似乎有点愚蠢。但是我没有看到它们,我仍然想知道我应该在哪里看到它们。可能有像我这样的人倾向于将不可变数据视为函数式编程的一个概念,而这并不总是最佳方法。例如,Haskell Wiki声称:“纯功能程序通常在不可变数据上运行。”(无论哪只狗写了这句话——我认为这是一句非常恰当的引用)。在远远不是纯函数式语言的Scala中,我不希望“函数式风格”(正如SORM网站上所说的那样)完全是纯的。由于这在SORM中与其他Scala ORM相比似乎有所不同,我希望在文档中更清楚地看到它的下划线。但一切都取决于你。我并不是想让你的作品看起来不那么光彩或不那么有价值。我认为你应该更清楚地说明你所提供的好东西。尽管如此,我还是感到惊讶的是,尽管如此,拉姆似乎在处理这种“误用”。我只是好奇会发生什么。即使我愿意,我也不会那样使用它。你必须承认你的问题很模糊,所以我所做的只是想猜测你到底在问什么,所以,当然,我可能会提出一些错误的假设,但我真的不知道你觉得我的答案有什么冒犯性。功能性方法几乎总是最好的方法。你说你倾向于将不可变的数据结构视为一种非最佳的方法,我不得不重申,你需要更多地了解函数式编程。是的,这种语言并不纯粹,但它的高级用户倾向于以纯粹的方式专门使用它。Scalaz支持这一说法。