所以当我读Play for Scala书时,我遇到了一些奇怪的东西,这在书中解释。这是相关的片段:Scala永久存储与Squeryl不变性
虽然有一些奇怪的事情发生。如果您使用不可变的 类 - 哪些是香草案例类 - 您可能会担心当您 发现Squeryl在您插入对象时更新对象的所谓不可变ID 字段。这意味着,如果你执行 下面的代码,
val myImmutableObject = Product(0, 5010255079763, "plastic coated blue", "standard paperclip, coated with blue plastic") Database.productsTable.insert(myImmutableObject) println(myImmutableObject)
输出将意外地是这样的:
Product(13, 5010255079763, "plastic coated blue", "standard paperclip, coated with blue plastic")
。如果代码的其余部分预计您的模型类之一的实例永不改变,这可能会导致不好的情况。 为了保护自己免受这类的东西,我们建议您 改变插入的方法,我们向您展示了更早的进入这样的:def insert(product: Product): Product = inTransaction { val defensiveCopy = product.copy productsTable.insert(defensiveCopy) }
我的问题是,考虑到产品类被这样定义:
import org.squeryl.KeyedEntity
case class Product(
id: Long,
ean: Long,
name: String,
description: String) extends KeyedEntity[Long]
Database
对象的定义如下:
import org.squeryl.Schema
import org.squeryl.PrimitiveTypeMode._
object Database extends Schema {
val productsTable = table[Product]("products")
...
on(productsTable) { p => declare {
p.id is(autoIncremented)
}}
}
那么如何声明val
的案例类别可以更改其中一个字段? Squeryl是使用某种反射来改变场地,还是以某种方式弄错书本?
我无法运行示例来验证可能的情况,但使用Squeryl的人可以给出答案?
它不是案件类本身,它是声明为“val”的'table'泛型。它指定访问存储在该表中的对象的规则(它们确实被表示为案例类)。 – Ashalynd
@ piet.t大声笑你是对的。我没有这样想过 – smac89