我被告知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属性。
这样做有点疯狂吗?开发人员的任何评论?
答案 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的单一使用。