所以當我讀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