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

时间:2013-08-15 15:15:24

标签: scala orm sorm

我被告知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属性。

这样做有点疯狂吗?开发人员的任何评论?

1 个答案:

答案 0 :(得分: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中的函数式编程一样多。关于如何使用case类,这实际上是一个非常基本的东西。所以请帮自己一个忙,并介绍一下函数式编程的基础知识。这将消除你已经拥有的关于SORM的所有问题,而且我敢肯定,还有很多正在进行的问题。

你的例子是可行的,它应该是,但它并没有改变它违背函数式编程的基本习语的事实,因此是对SORM的单一使用。